我正在使用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
但它仍然向我显示同样的错误。我做了所有可能的改变,但我没有取得任何成功......
答案 0 :(得分:31)
我在/ var / log / apache2 / error_log中遇到了同样的错误。 我终于意识到Perl脚本是直接从我的Windows系统复制的(通过Parallels虚拟机),似乎Windows'回车“\ r \ n”会导致此错误。
当我使用ASCII模式将此Perl脚本从Windows FTP到Mac时 自动将“\ r \ n”转换为“\ r”, 相同的Perl脚本无需任何修改即可正常工作。
答案 1 :(得分:10)
我多次遇到同样的问题 - 尝试将文件中的shebang修改为:
#!/usr/bin/perl -w
现在为什么这会使脚本执行,打败我......如果你发现了,请告诉我们。
答案 2 :(得分:10)
错误消息&#34;没有这样的文件或目录&#34;不是来自Apache也不是来自Perl。当Apache调用脚本时,它会将执行传递给系统的命令行解释器(CLI)。此CLI打开脚本文件并读取第一行&#34;#!/ usr / bin / perl&#34; (shebang line)。
Sam Tseng详细说明,该文件显然包含一个Windows换行字符序列:&#34; \ r \ n&#34; (十六进制代码:x0D x0A,符号:CR LF)。现在,CLI解释器读取该行,直到&#34; \ n&#34;字符。 CLI不会识别&#34; \ r&#34;字符,所以它成为路径的一部分&#34; / usr / bin / perl \ r &#34;并且不再是换行的一部分了。
为什么选项&#39; -w&#39;解决这个问题?
当您添加选项&#39; -w&#39;而不是角色&#39; \ r&#39; becommes参数&#34; -w \ r&#34;的一部分。现在可以找到Perl可执行文件的路径&#34; / usr / bin / perl&#34;和&#34; -w \ r&#34;作为命令行参数传递。但是,Perl非常好,并且在处理&#34; -w \ r&#34;时不会导致错误。选项。
答案 3 :(得分:2)
我遇到了类似的错误:(2)没有这样的文件或目录:'/var/www/cgi-bin/aaa.py'的exec失败了。像Above这样的答案无法解决。然后我发现:vim aaa.py :set ff
并且fileformat是dos。 :set ff=unix
并很快修复了它。
答案 4 :(得分:1)
您需要删除&#34; Windows&#39;回车&#34;在Windows环境中创建文件时生成的文件。
这可以通过命令
轻松完成dos2unix fst.cgi fst.cgi
第一个fst.cgi是您要转换的文件,第二个是目标文件名,可以保持不变。
下一步是运行命令
chmod 755 fst.cgi
这将覆盖文件的权限,并允许您执行文件。
祝你好运答案 5 :(得分:0)
# su -c /usr/lib/cgi-bin/fst.cgi apache
/usr/lib/cgi-bin
具有755权限/usr/lib/cgi-bin/fst.cgi
具有755权限答案 6 :(得分:0)
同一问题使我几乎整天都花了!我想提供一种可能性。
我的PC和远程服务器操作系统均为 Ubuntu 16.04 。我正在使用FileZilla将文件从PC传输到远程服务器。 默认传输类型设置为自动,这就是我的原因。
解决方案是将默认传输类型设置为二进制。导航路径为: 编辑-> 首选项-> 设置-> 传输-> 文件类型- > 默认传输类型: