阿帕奇(2)投掷"No such file or directory: exec of '/usr/lib/cgi-bin/fst.cgi' failed"



我在Ubuntu 10.10(Maverick Meerkat(中工作,并在Apache下运行我的CGI脚本,但它显示了以下错误。。。

[Sat errorNo such file or directory:'/usr/lib/cgi-bin/fst.cgi'的exec失败〔2011年10月22日星期六02:56:45〕〔错误〕〔客户端127.0.0.1〕脚本头过早结束:fst.cgi

我的脚本是

#!/usr/bin/perl
print "Content-type:text/htmlnn";
print "hello world";

我已经设置了文件的权限。。。

我还在文件apache.conf:中添加了以下行

ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory /usr/lib/cgi-bin/>
   Options +ExecCGI
</Directory>
AddHandler cgi-script .cgi .pl

但它仍然向我展示了同样的错误。我已经做了所有可能的改变,但没有取得任何成功。。。

我在/var/log/apache2/error_log中遇到了相同的错误。我终于意识到Perl脚本是直接从我的Windows系统(通过Parallels虚拟机(复制的,似乎是Windows的回车"\r\n"导致了这个错误。

当我使用ASCII模式将此Perl脚本从Windows FTP到Mac时要自动将"\r\n"转换为"\r",相同的Perl脚本在没有任何修改的情况下可以正常工作。

错误消息"No such file or directory"既不是来自Apache,也不是来自Perl。Apache在调用脚本时,会将执行传递给系统的命令行解释器(CLI(。此CLI打开脚本文件并读取第一行"#!/usr/bin/perl"(shebang行(。

正如Sam Tseng所阐述的,该文件显然包含Windows换行字符序列:">\r\n"(六进制代码:x0D x0A,符号:CR LF(。现在,CLI解释器读取该行,直到出现"\n"字符。CLI无法识别"\r"字符,因此它成为路径"/usr/bin/perl\r"的一部分,不再是换行符的一部分。

为什么选项"-w"可以解决此问题

添加选项"-w"时,字符"\r"将成为参数"-w\r"的一部分。Perl可执行文件的路径现在可以找到"/usr/bin/Perl","-w\r"作为命令行参数传递。然而,Perl很好,在处理"-w\r"选项时不会引起错误。

我多次遇到同样的问题-尝试将文件中的shebang修改为:

#!/usr/bin/perl -w

现在,为什么这会让脚本执行,让我大吃一惊。。。如果你发现了,也请告诉我们。

您需要删除在Windows环境中创建文件时产生的"Windows回车"。

这可以通过命令很容易地完成

dos2unix fst.cgi fst.cgi

第一个fst.cgi是要转换的文件,第二个是目标文件名,可以保持不变。

下一步是运行命令

 chmod 755 fst.cgi

这将覆盖文件的权限,并允许您执行该文件。

祝好运

我遇到了类似的错误:(2(没有这样的文件或目录:'/var/www/cgi-bin/aa.py'的exec失败。像上面这样的答案是无法解决的。然后我发现:vim aaa.py :set ff,文件格式是dos。:set ff=unix和wq很快就修复了它。

  • 确保您的脚本在apache用户# su -c /usr/lib/cgi-bin/fst.cgi apache下执行正常
  • 确保目录/usr/lib/cgi-bin具有755权限
  • 确保脚本/usr/lib/cgi-bin/fst.cgi具有755权限

同样的问题几乎花了我一整天的时间!我想提供一种可能性。

我的电脑和远程服务器操作系统都是Ubuntu16.04。我使用FileZilla将文件从电脑传输到远程服务器。默认传输类型设置为自动,这就是我的原因。

解决方案是将默认传输类型设置为二进制。导航路径为:编辑->首选项>设置->传输-->文件类型>>默认传输类型:

最新更新