首页 > 解决方案 > 通过在 shebang 行中添加“-w”解决了 perl 脚本的内部服务器错误。但为什么?

问题描述

我花了好几个小时试图修复 perl 程序的内部服务器错误。我将程序提炼成最简单的程序,但没有任何效果。事实上,这是整个程序:

#!/usr/local/bin/perl

use strict;
print "Content-type: text/html\n\n";
print <<"thepage";
<html><head><title>Test</title></head><body>
<p>help</p>
</body></html>
thepage

无法让它工作。权限正确。在同一个目录中,我确实有一百个其他脚本不断运行。httpd.conf 很好。它在通过 SSH 连接到服务器时从命令行运行。错误信息说:

[Mon May 18 09:59:29 2020] [error] [client 98.190.183.148] (13)Permission denied: exec of '/data/www/facialsurgery/root/cgi-bin/test_print_2.pl' failed
[Mon May 18 09:59:29 2020] [error] [client 98.190.183.148] Premature end of script headers: test_print_2.pl

但是我修好了!通过在 shebang 行中添加“-w”,该行显示:

#!/usr/local/bin/perl -w

但正如我所提到的,我有很多程序在没有 -w 的情况下运行良好。我能做些什么来更多地追踪这一点,所以我最终不会在更重要的程序上遇到更多麻烦?非常感谢您对此的任何见解。

标签: apacheperlbrowserserverinternals

解决方案


错误:

(13)Permission denied: exec of '/data/www/facialsurgery/root/cgi-bin/test_print_2.pl' failed

这意味着由于权限错误,Web 服务器 (Apache) 无法执行脚本。(13是 的错误号Permission denied。)这与 的存在与否无关-w[1]

首先,确定 Web 服务器 (Apache) 以哪个用户身份运行。对于这篇文章的其余部分,我将假设它是默认的,www-data.

然后,确保用户(或其组)可以读取(授予r权限)和可执行(x)以下文件:www-data

  • /data/www/facialsurgery/root/cgi-bin/test_print_2.pl

这包括确保用户(或其组)可以访问以下目录 ( ) xwww-data

  • /data/www/facialsurgery/root/cgi-bin
  • /data/www/facialsurgery/root
  • /data/www/facialsurgery
  • /data/www
  • /data

如果这些权限没有问题,您也可能正在运行违规或卷范围的限制(例如noexec值的属性)或其他安全措施(例如 SELinux 限制)


  1. 我认为古代系统曾经将 shebang ( #!) 之后的所有内容都视为要执行的命令。在这样的系统上,内核会尝试执行不存在的文件/usr/local/bin/perl -w。但这会导致 errno 2( No such file or directory),我不相信任何现代系统都会这样做。

推荐阅读