Apache2 阿帕奇(2)抛出;没有这样的文件或目录:exec of'/usr/lib/cgi-bin/fst.cgi';“失败”;

Apache2 阿帕奇(2)抛出;没有这样的文件或目录:exec of'/usr/lib/cgi-bin/fst.cgi';“失败”;,apache2,cgi,Apache2,Cgi,我在Ubuntu10.10(MaverickMeerkat)中工作,并在下运行我的脚本,但它向我显示了以下错误 [Sat错误没有这样的文件或目录:'/usr/lib/cgi-bin/fst.cgi'的exec失败 [Sat Oct 22 02:56:45 2011][error][client 127.0.0.1]脚本头过早结束:fst.cgi 我的剧本是 #!/usr/bin/perl print "Content-type:text/html\n\n"; print "hello world

我在Ubuntu10.10(MaverickMeerkat)中工作,并在下运行我的脚本,但它向我显示了以下错误

[Sat错误没有这样的文件或目录:'/usr/lib/cgi-bin/fst.cgi'的exec失败 [Sat Oct 22 02:56:45 2011][error][client 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
ScriptAlias/cgi-bin//usr/lib/cgi-bin/
选项+执行CGI
AddHandler cgi script.cgi.pl
但它仍然显示出同样的错误。我已经做了所有可能的更改,但没有取得任何成功…

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

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

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

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

#!/usr/bin/perl -w
现在,为什么这会让脚本执行,这让我很吃惊……如果您发现了,请让我们也知道。

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

正如Sam Tseng所阐述的,该文件显然包含Windows换行符序列:“\r\n”(hexcode: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”选项时不会导致错误。

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

这可以通过命令轻松完成

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

下一步是运行命令

dos2unix fst.cgi fst.cgi
 chmod 755 fst.cgi
这将覆盖该文件的权限,并允许您执行该文件


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

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

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

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

您确定您的脚本不应该以
#!/usr/bin/perl
开头吗?我的脚本不应该以#!usr/bin/perl开头。我想,问题出在脚本头:try
#!/usr/bin/perl
。我也尝试过这个…但它显示了相同的错误…升级php后我也发生了类似的情况-当我删除旧php时,它不知何故也删除了php cgi,所以我只是重新安装了它
sudo apt install php cgi
这里有一个perl脚本,用于在Windows和Mac之间转换文本文件,而不使用FTP:。要知道如何使用,只需键入:“perl-sdos2mac.pl”+1谢谢你,我被这件事抓住了。我用
dos2unix
在我的ubuntu机器上更正了行尾。今天这帮我节省了12次。真是太奇怪了,但它仍然有效!只是..呃..告诉我为什么我要改用PHP:我也为自己工作过,但见Sam Tseng的答案。真正的原因是我的脚本在Linux上使用了DOS行尾“-w”似乎使PERL在行尾方面更加出色。它在
--help
中说:
-w启用了许多有用的警告
。写下来,你就会看到发生了什么:“!!/usr/bin/PERL-w\r”windows换行序列的“\r”字符“\r\n”从路径中删除“/usr/bin/PERL”并成为参数“-w\r”的一部分。现在系统可以找到perl可执行文件并将“-w\r”作为参数传递。