很奇怪~Apache无法找到实际存在的“bash”来执行我的cgi文件〜

时间:2011-09-24 22:32:31

标签: apache cgi

你可能很容易回答。 我的问题是关于cgi和apache web服务器。 简单一点,我有一个包含表格的html“form.html”。要访问它,请在浏览器中键入“127.0.0.1/form.html”。 在这个html文件中单击“提交”后,它应该被命名为“127.0.0.1 \ cgi-bin \ cginame.cgi”,“cginame.cgi”的内容如下:

#!/bin/bash

if [ $REQUEST_METHOD="GET" ]
then
data=$QUERY_STRING
else
data='cat'
fi
java mortcal $data

“mortcal”是一个java程序,用于计算并返回包含结果给用户的HTML页面。 我正在使用apache 2.2和ubuntu 10.04。 问题是当我点击“form.html”中的“提交”按钮时,我在错误日志中得到了这些:

[Sat Sep 24 15:00:20 2011] [error] (2)No such file or directory: exec of '/usr/lib/cgi-bin/mortcgi.cgi' failed
[Sat Sep 24 15:00:20 2011] [error] [client 127.0.0.1] Premature end of script headers: mortcgi.cgi

我知道这是因为apache找不到“/ bin / bash”来执行cgi文件。但我确实有“/ bin / bash”。 这太奇怪了。请帮帮我。提前谢谢。

3 个答案:

答案 0 :(得分:0)

要执行CGI脚本,您需要配置Apache以允许此操作,并且您的脚本必须遵循HTTP协议,方法是以正确的格式和正确的权限发送数据,并且依次打开和打开。

这是一个很棒的教程,其中包含一个示例:http://httpd.apache.org/docs/2.2/howto/cgi.html

...但是,我需要说:一般来说,通过Apache在shell脚本中运行java程序是个坏主意。每个请求都加载java运行时引擎(JRE),运行程序,然后卸载它。环境,文件所有权等方面存在问题 - 所有这些都是为什么有像tomcat这样的应用程序服务器的原因。所以如果你只是想尝试一下,那很好。如果您认为这是在专业生产环境中完成某项工作的好方法,我会重新考虑。

答案 1 :(得分:0)

如上所述,这似乎是一种糟糕的做事方式,但是:

  1. 脚本文件权限是否允许执行Web服务器用户?
  2. 您是否正在使用任何安全框架,例如selinux会应用其他限制?

答案 2 :(得分:0)

我检查了配置文件。他们都还好。所以我一直在网上搜索,最后我看到了这个:

“如果您从Windows计算机上复制了脚本,则可能会在行尾的^ M处被绊倒。您可以使用cat -v /usr/lib/cgi-bin/printenv.pl | head -1来验证该行末尾没有^ M.“

我确实从windows复制了我的cgi文件!我忘了提它,因为我认为这不是什么大问题。

现在我通过在vi中输入“:%s / ^ V ^ M // g来删除^ M。这个问题已经解决了。非常感谢你的回答,哈里森先生和黑暗猎鹰,谢谢大家。