Bash其实也可以做CGI用
标题其实是“废话”。因为,其实稍微熟悉web原理的都知道,理论上,所有可执行的程序/脚本,都可以被server程序(例如apache/mini_httpd/lighttpd/nginx等)调用,只要能够输出HTML,都可以成功。
而这个用bash做CGI的想法,纯属闲着无聊的时候,瞎想出来的。不过有这个想法的,我肯定不是第一人,这里和这里都有类似的描述。
不过,我这个Web From Scratch的过程还颇有点波折,试了蛮久才成功,就在此记录一下。
其实,说白了都是也就一句话:扩展名不能随意取。当然这个只是针对我这个主机的apache来说的,其他的server可能有其他的规则,暂且不做定论。
之前我一直把我的脚本文件名写成index.sh,结果怎么试都不行,后来无意中改成inedx.py(虽然里面还是#!/bin/bash开头的)居然就可以了,于是我就找到原因了,现在我改成个更通用的index.cgi了,哈哈。
另外关于.htaccess,由于自己也是一知半解,就不讨论了,有兴趣的话,可以看看这里,这里只贴下我用到的代码,可以把对此域名的任何路径的请求都让index.cgi来处理。
RewriteEngine on DirectoryIndex index.cgi RewriteCond %{REQUEST_URI} !(index.cgi) RewriteRule ^(.*)$ index.cgi/$1 [L] |
来看看我的bash,就是简单地输出服务器信息:
#!/bin/bash #下面这两行头一定要有,不然可是会引发 500 Internal Server Error 错误的。 echo "Content-type: text/html" echo "" echo "<h1>Bash CGI works!</h1>" env | while read line;do echo "<b>" echo "$line" | cut -d= -f 1 echo "</b>=<i>" echo "$line" | cut -d= -f 2- echo "</i><br>" done |
最近几天,可以点击 http://hzlug.org/abc?xxx=yyy 观察这个脚本运行的效果,以后可以把这个地址做它用,嘿嘿。
可以看到 REDIRECT_URL 和 QUERY_STRING 这两个环境变量分别是路径和参数,这样理论上就可以用一个脚本来完成很复杂的功能了~
至于HZLUG到底会做成什么样子,还请大家多多提意见哦~
yegle 在 2009年08月29日 23:09 说:【 】
囧…这个还是要有apache啊…
今天在用php实现web server的功能…折腾死我了…
bones7456 在 2009年08月29日 23:21 说:【 】
是呀,CGI呀。如果用bash直接监听端口/处理请求的话,够呛的,不过肯定是可以的。
雪梨 在 2009年08月29日 23:22 说:【 】
bash 也可以做 web server 的呀,
用 nc 监听就可以了
est 在 2009年08月30日 07:59 说:【 】
见本id链接。。。。
bones7456 在 2009年08月30日 15:14 说:【 】
Orz IIS…CMD…杀了我吧~
吼吼 在 2009年08月30日 09:44 说:【 】
曾经看到有人用bash+rrdtool做了个日志分析站点
ray 在 2009年08月30日 11:30 说:【 】
骨头—bash高手
TualatriX 在 2009年08月31日 09:45 说:【 】
骨头啊!你太牛了!
hzlug的重任,还是交给你了!
bones7456 在 2009年08月31日 09:57 说:【 】
真用bash写hzlug啊?我晕哦。。。
xiooli 在 2009年08月31日 10:38 说:【 】
不错,我以后写 cgi 就用 bash 写了,那些个什么 php,python 阿 ruby 呀啥的都搞不懂,就 bash 还玩得转,哈哈
xiooli 在 2009年08月31日 10:39 说:【 】
不过是不是有隐患呢,这个可以执行系统命令阿?
bones7456 在 2009年08月31日 11:12 说:【 】
哈哈,就知道你也是个bash党~
要说隐患,php/python/ruby 哪个没有个 system 之类的执行系统命令的指令呢?bash里只要没有eval之类的,应该还是安全的吧?
xiooli 在 2009年08月31日 20:35 说:【 】
其实,cgi脚本用sh结尾也是可以的,我用lighttpd,配置里面添加了 cgi.assign = ( “.sh” => “/bin/bash” ) 就可以用sh结尾了。
bones7456 在 2009年08月31日 20:46 说:【 】
是啊,但是我没有主机的root权限哦~~
HicroKee 在 2009年09月01日 22:14 说:【 】
我曾经用MASM写过一个WEB服务器,用dll作CGI,非常爽~
cnhackTNT 在 2009年09月02日 10:51 说:【 】
apache 加上 AddHandler cgi-script .sh 就可以使用这个扩展名了
另外,我一般都是把 bash 写的 cgi 丢到 ScritpAlias 指定的目录里面,不管你啥扩展名,我一般连扩展名都省了。
GET 方法的参数什么的从 PATH_INFO 里面读,这样就有个友好的 URI,不用再看到问号了
结合 mysql 命令行,和数据库的交互也不成问题, 管道串起来特别方便:-)
bones7456 在 2009年09月02日 12:21 说:【 】
我也试过在.htaccess里添加AddHandler cgi-script .sh,但是没搞成,可能是apache的主设置里不允许吧。。。
xiooli 在 2009年09月02日 23:42 说:【 】
骨头,知道 bash cgi 怎么上传文件不?搜了好久没有找到,只好用 python cgi 了 =_=!