我正在尝试制作一个非常简单的 shell 脚本,以在 OpenWRT 安装上运行的 uhttpd 服务器上作为 CGI 运行。
该文件被称为/www/cgi-bin/first.cgi
并且看起来像......
#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Bash as CGI"
echo "</title></head><body>"
echo "<h1>Hello world</h1>"
echo "Today is $(date)"
echo "</body></html>"
...我做了一个
chmod +x first.cgi
在文件上。
当我试图拉起...
http://192.168.15.1/cgi-bin/first.cgi
...浏览器得到...
Unable to launch the requested CGI program:
/www/cgi-bin/first.cgi: Text file busy"
我可以从 shell 提示符cat
处获取vi
该文件,因此不确定该文件如何繁忙,甚至不知道如何找出该文件。
我究竟做错了什么?
答案1
首先,我猜测文件系统/www
已映射到http://servername/
根目录,这意味着文件/www/cgi-bin/
夹映射到http://servername/cgi-bin/
,因此您应该寻找http://servername/cgi-bin/first.cgi
。
也可能是 http 服务器进程无法读取,即使您可以读取。文件模式应该是555 (r-xr-xr-x)
或550 (r-xr-x---)
取决于文件组所有权是否属于 httpd 所在的组。
另一种可能性是 $(date) 需要 shell 外部命令,该命令在运行时可能不可用。不要尝试没有那个。
还是行不通?服务器可能会对允许 CGI 执行的位置很挑剔。通常只http://servername/cgi-bin/
允许使用,这意味着您位于文件名 /www/cgi-bin/first.cgi 的正确位置。uHTTPd 文档似乎需要设置 CGI 文件夹,否则根本不允许 CGI。请从配置文件中检查这一点。
请注意,我是从一般的 Unixy 背景来回答的,不太了解 OpenWRT 或 uHTTPd 的细节。我确实有几十年的 Unix/Linux 背景,并且对通用架构非常熟悉。
答案2
(令人尴尬的)答案是我一直在使用 CAT 创建文件并按 Control-Z 完成。 Control-Z 仅将 CAT 作业推入后台,因此 CAT 仍打开文件。使用 Control-D 击键正确完成对文件的 CAT 操作可关闭文件并消除“文本文件忙”错误。