2

我试图在一台机器上运行 3 个独立的域,每个域都有它的用户(通过虚拟主机)所以我决定使用 suExec 来完成我的任务(它也与 apache 一起安装):

在“apache”用户和组上运行的全局服务器配置。

其中一位用户(我正在尝试访问的用户)的配置:

listen 9999
<VirtualHost *:9999>
        ServerName *:9999
        DocumentRoot "/home/efpanel/public_html"
        ErrorLog "/home/efpanel/err.log"
        <IfModule suexec_module>
#               SuexecUserGroup efpanel efpanel
        </IfModule>
        # Directory settings...
        ...

        <IfModule alias_module>
                ScriptAlias /cgi-bin/ "/home/efpanel/public_html/cgi-bin/"
        </IfModule>
</VirtualHost>

问题:
当 SuexecUserGroup 的行被注释时,运行 perl 脚本将在用户“apache”上 - 不是我想要的,但至少运行。
但是:如果我取消注释这一行,即使是简单的 perl 脚本也会失败并出现错误 500(内部服务器错误)。检查日志文件,我得到的错误是:

[Sat Dec 21 01:34:56.274872 2019] [cgi:error] [pid 31211] [client 183.28.7.14:7262] End of script output before headers: test.cgi, referer: http://99.99.99.99:9999/

注意:
1) mod_suexec 已安装并启用(以下是“ls -l /usr/sbin | grep suexec”的结果):

-r-x--x--- 1 root apache  15440 Aug  8 07:42 suexec


2) 我在 CentOS 7 上运行 Apache 2.4 httpd,CGI 是用 PERL 编写的。
3)我知道 suEXEC 只适用于脚本文件,但对我来说就足够了——如果我让它以某种方式工作的话。
4)检查配置值,我无法确定suexec日志文件在哪里,并且无法通过“find / suexec.log”命令找到它。配置值如下(似乎是标准的):

[root@vps cgi-bin]# suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="apache"
 -D AP_LOG_SYSLOG
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=500
 -D AP_USERDIR_SUFFIX="public_html"

我唯一关心的是“DOC_ROOT”,它是“/var/www”,并且与“/home/efpanel”有任何共同点 - 但是:a)我不知道如何在编译后重新配置 suexec,b)我不知道'认为没有必要,也许“按原样”可以吗?
5)cgi脚本、cgi-bin目录、public_html目录和/home/efpanel目录都属于同一个用户和组(efpanel),访问权限为0755,但“/home/efpanel”的访问权限为0711。
6)我尝试在脚本的第一行添加“-w”,如下所示

#!/usr/bin/perl -w

my $u=(getpwuid $>)[0];
print "ContentType: text/html;\n\n$u";

exit 0;

正如它所看到的,一个非常简单的脚本并失败了。

4

0 回答 0