nginx + fcgiwrap 创建一条运行远程 shell 的通路

有时候,可能有这样一种情况:即通过访问一个 http 请求,运行一下某台远程机器上的一个 shell 脚本,比如:用来启动一个测试,用来发送一个邮件,或者短信通知一下管理员,诸如此类的一个任务,等等;

安装 python,或者 php 这类脚本当然可以实现这类需求,其实还有一个更简单的做法,就是 fcgiwrap;本文就简单说一下其原理。

环境
  • nginx 源码安装要点,nginx 当前 1.10.1 版;
  • CentOS release 6.8;
安装 fcgiwrap
  • 从 Github 下载,最新 1.1.0 版;
  • 常规编译安装;
    参照 How to install fcgiwrap to serving CGI/Perl Scripts in nginx @ knowledgebase.cc 安装 fcgiwrap 和 spawn-fcgi;
    解决错误 Nginx connect() to unix:/var/run/fcgiwrap.socket failed;
  • P.S.
install -d -m 755 /usr/local/sbin
install -m 755 fcgiwrap /usr/local/sbin
install -d -m 755 /usr/local/man/man8
install -m 644 fcgiwrap.8 /usr/local/man/man8
nginx.conf 片段示例
  location ~ (\.sh|\.lua)$ {
    root /home/example/autotest;

    include fastcgi_params;
    fastcgi_pass unix:/var/run/fcgiwrap.socket;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  }
  • 可以通过 "HTTP Basic Authentication" 协议(nginx auth basic 指令)加以简单访问限制;
    curl http://username:[email protected]/ 或者通过 Authorization 头携带凭证也可;
  • 也可以通过加自定义头来简单限定访问;
    curl -H "X-Test-Who: michael" http://autotest.example.com/cpuinfo.sh 来访问;
cpuinfo.sh 示例
#!/bin/sh
# -*- coding: utf-8 -*-
NAME="cpuinfo"
echo -e "X-Test-Author: Michael\r\n"
echo ""
echo "$NAME"
echo ''
echo ''
echo ''
echo ''
echo "
"
echo -e "`date`\n"
echo -e "uname -a"
uname -a
echo -e "\ncpuinfo"
#cat /proc/cpuinfo
echo "
"
参考资料
  • nginx 安装 lua 模块;
    1)nginx - How to run a shell script on every request?
    2)动态加载 lua 或者 直接将 lua 编译进 nginx;
  • Running Shell Script from html webpage? @ ruby-forum.com;
    Echo newline in Bash prints literal \n(echo -e 是一个简单方式);
  • git server 除了提供 ssh 方式访问外,也可以使用 fcgiwrap 这种方式提供 http 服务;
  • HTTP X-Headers 自定义头示例;
    X-Test-App: cr,nginx 使用 $http_x_test_app,PHP 使用 X_TEST_APP;
    X-Test-Key: nc,nginx 使用 $http_x_test_key,PHP 使用 X_TEST_KEY;
  • Access permission problem (dot at the end of file permissions)?
  • What does the dot mean at the end of -rw-r--r--? How do you set it with chmod?;

你可能感兴趣的:(nginx + fcgiwrap 创建一条运行远程 shell 的通路)