Apache(2)抛出“没有这样的文件或目录:'/usr/lib/cgi-bin/fst.cgi'的exec失败了”

问题描述 投票:14回答:7

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

[周六错误没有这样的文件或目录:'/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/html\n\n";
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

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

apache2 cgi
7个回答
31
投票

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

当我使用ASCII模式将此Perl脚本从Windows FTP转换为Mac以自动将“\ r \ n”转换为“\ r \ n”时,相同的Perl脚本无需任何修改即可正常工作。


11
投票

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

#!/usr/bin/perl -w

现在为什么这会使脚本执行,打败我...如果你发现请告诉我们。


10
投票

错误消息“没有这样的文件或目录”不是来自Apache也不是来自Perl。当Apache调用脚本时,它会将执行传递给系统的命令行解释器(CLI)。此CLI打开脚本文件并读取第一行“#!/ usr / bin / perl”(shebang line)。

正如Sam Tseng详细阐述的那样,该文件显然包含一个Windows换行字符序列:“\ r \ n”(十六进制代码:x0D x0A,符号:CR LF)。现在,CLI解释器读取行直到“\ n”字符。 CLI不识别“\ r”字符,因此它成为路径“/ usr / bin / perl \ r \ n”的一部分,并且不再是换行符的一部分。

为什么选项'-w'可以解决这个问题?

当你添加选项'-w'而不是字符'\ r'时becommes参数“-w \ r \ n”的一部分。现在可以找到Perl可执行文件的路径“/ usr / bin / perl”,并将“-w \ r”作为命令行参数传递。但是,Perl很好,在处理“-w \ r”选项时不会导致错误。


2
投票

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


1
投票

您需要删除在Windows环境中创建文件时生成的“Windows'回车符”。

这可以通过命令轻松完成

dos2unix fst.cgi fst.cgi

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

下一步是运行该命令

 chmod 755 fst.cgi

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

祝好运


0
投票
  • 确保您的脚本在apache user:# su -c /usr/lib/cgi-bin/fst.cgi apache下正常运行
  • 确保目录/usr/lib/cgi-bin有755权限
  • 确保脚本/usr/lib/cgi-bin/fst.cgi有755权限

0
投票

同样的问题花了我差不多一整天!我想提供一种可能性。

我的PC和远程服务器操作系统都是Ubuntu 16.04。我正在使用FileZilla将文件从PC传输到远程服务器。默认传输类型设置为自动,这是我的原因。

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

© www.soinside.com 2019 - 2024. All rights reserved.