我试图在一台机器上运行 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;
正如它所看到的,一个非常简单的脚本并失败了。