用户目录中的 Apache CGI“头文件前的脚本输出结束”

新手上路,请多包涵

我知道关于这个主题有一些问题,但似乎没有一个能解决我的问题。看到 这个这个这个

我在 Linux、Fedora21 上,我正在尝试启用每个用户目录 CGI 脚本。我按照 这些 说明进行操作,但没有成功。

我得到错误:

 [cgi:error] End of script output before headers: test.cgi

test.cgi 是一个可执行的sh文件,包含一个非常简单的脚本:

 #!/usr/bin/sh

echo "Content-type: text/plain"
echo ""
echo "Hello"

它具有可执行标志并且从 shell 运行没有问题。我也尝试过使用 Python:同样的结果。

我还禁用了 selinux 以进行良好的衡量。

我还尝试将 debug 级别设置为 Apache 的 ErrorLog,但我得到的只是在上述错误之前“授予”权限。

我还配置了 /etc/httpd/conf.d/userdir.conf 文件

<Directory "/home/*/public_html">
    AllowOverride All
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require all granted
</Directory>

<Directory /home/*/public_html/cgi-bin/>
    Options ExecCGI FollowSymLinks
    SetHandler cgi-script
    AddHandler cgi-script .cgi .exe .pl .py .vbs
    Require all granted
    AllowOverride All
</Directory>

并重新启动服务器。没有成功。在我看来一切都很好,我不明白……怎么了??

编辑:

我忘了补充一点,这个问题只是针对每个用户的目录:如果我将相同的脚本移动到 /var/www/cgi-bin 目录,它会按预期工作。

编辑2:

外壳确实存在:

 $ ls /usr/bin/sh
/usr/bin/sh

原文由 AkiRoss 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

最后我解决了。感谢@JimB,因为在 他的评论 中他指出了我不知道的 SUEXEC(或者直到现在才被忽略)。

在阅读了一些 suEXEC 文档 后,我明白问题必须存在。所以,我看了一下配置:

 # suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=1000
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_SYSLOG
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=1000
 -D AP_USERDIR_SUFFIX="public_html"

一切看起来都很好(对我的用户来说很好的 uid/gid,userdir_suffix 很好,等等)。所以我看了一下系统日志:

 # journalctl -b | grep "suexec"
May 22 11:43:12 caladan suexec[5397]: uid: (1000/user) gid: (1000/user) cmd: test.cgi
May 22 11:43:12 caladan suexec[5397]: directory is writable by others: (/home/user/public_html/cgi-bin)

这就是 问题所在:我的 cgi-bin 目录可被其他人写入

我通过简单地将权限更改为 755 来修复。

原文由 AkiRoss 发布,翻译遵循 CC BY-SA 3.0 许可协议

对我来说,当我将 shebang 线( #!/usr/bin/sh )更改为 #!/usr/bin/env sh --- 时,它起作用了。我发现 什么是首选的 Bash shebang? 似乎有效(但请注意, sh 不同于 bash 所以如果你想使用 sh 坚持下去)。

所以这段代码对我有用:

 #!/usr/bin/env sh
echo "Content-type: text/plain"
echo ""
echo "Hello"

此外,根据上述帖子,似乎 /usr/bin/env sh 似乎比 /bin/sh 更受欢迎。我不知道每个目录的东西。

原文由 jkd 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题