I am LAZY bones ? all linux

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到底会做成什么样子,还请大家多多提意见哦~

最后修改时间: 2009年08月29日 22:59

本文章发表于: 2009年08月29日 22:59 | 所属分类:编程相关. | 您可以在此订阅本文章的所有评论. | 您也可以发表评论, 或从您的网站trackback.

18 个评论 关于: “Bash其实也可以做CGI用”

  1. yegle 在 2009年08月29日 23:09 说:回复

    囧…这个还是要有apache啊…
    今天在用php实现web server的功能…折腾死我了…

    • bones7456 在 2009年08月29日 23:21 说:回复

      是呀,CGI呀。如果用bash直接监听端口/处理请求的话,够呛的,不过肯定是可以的。

  2. 雪梨 在 2009年08月29日 23:22 说:回复

    bash 也可以做 web server 的呀,
    用 nc 监听就可以了

  3. est 在 2009年08月30日 07:59 说:回复

    见本id链接。。。。

    • bones7456 在 2009年08月30日 15:14 说:回复

      Orz IIS…CMD…杀了我吧~

  4. 吼吼 在 2009年08月30日 09:44 说:回复

    曾经看到有人用bash+rrdtool做了个日志分析站点

  5. ray 在 2009年08月30日 11:30 说:回复

    骨头—bash高手

  6. TualatriX 在 2009年08月31日 09:45 说:回复

    骨头啊!你太牛了!
    hzlug的重任,还是交给你了!

    • bones7456 在 2009年08月31日 09:57 说:回复

      真用bash写hzlug啊?我晕哦。。。

  7. xiooli 在 2009年08月31日 10:38 说:回复

    不错,我以后写 cgi 就用 bash 写了,那些个什么 php,python 阿 ruby 呀啥的都搞不懂,就 bash 还玩得转,哈哈

  8. 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权限哦~~

  9. HicroKee 在 2009年09月01日 22:14 说:回复

    我曾经用MASM写过一个WEB服务器,用dll作CGI,非常爽~

  10. 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的主设置里不允许吧。。。

  11. xiooli 在 2009年09月02日 23:42 说:回复

    骨头,知道 bash cgi 怎么上传文件不?搜了好久没有找到,只好用 python cgi 了 =_=!

发表评论