用户目录中的Apache CGI"标题之前的脚本输出结束"

Aki*_*oss 4 linux apache cgi

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

我在Linux,Fedora21上,我正在尝试启用每个用户目录的CGI脚本.我遵循了这些指示,但没有成功.

我收到错误:

[cgi:error] End of script output before headers: test.cgi
Run Code Online (Sandbox Code Playgroud)

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

#!/usr/bin/sh

echo "Content-type: text/plain"
echo ""
echo "Hello"
Run Code Online (Sandbox Code Playgroud)

它有可执行标志,并且没有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>
Run Code Online (Sandbox Code Playgroud)

并重新启动服务器.没有成功.一切看起来都很好,我无法理解......有什么不对?

编辑:

我忘了添加该问题只针对每用户目录:如果我将相同的脚本移动到/var/www/cgi-bin目录,它按预期工作.

编辑2:

shell确实存在:

$ ls /usr/bin/sh
/usr/bin/sh
Run Code Online (Sandbox Code Playgroud)

Aki*_*oss 8

最后我解决了这个问题 感谢@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"
Run Code Online (Sandbox Code Playgroud)

一切看起来都很好(我的用户好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)
Run Code Online (Sandbox Code Playgroud)

这就是问题:我的cgi-bin目录是由别人写的.

我通过简单地将权限更改为755.