【发布时间】:2011-06-26 20:01:53
【问题描述】:
我有一个通过 Apache 或命令行调用的 Perl 脚本。
出于测试目的,我将我希望 Perl 脚本运行的用户名传递给它,并使用POSIX::setuid 设置uid。
如果我从命令行运行脚本,则 uid 设置正确:
use CGI::Pretty qw/:standard/;
use POSIX qw(setuid getuid);
...
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment,
$pwGcos, $pwHome, $pwLogprog) = getpwnam($username);
if ((defined $pwUid) && (getuid() == $pwUid)) {
setuid($pwUid);
print header;
print Dumper $<;
}
else {
print header(-status => 401);
print "Could not setuid to correct uid (currently: )".getuid()."\n";
}
命令行输出显示指定$username 的正确uid,而不是开始运行脚本的测试帐户的uid。
如果我通过 Apache 调用脚本,那么 uid 仍然设置为 apache 用户的 ID,并且永远不会更改。
我不相信我可以在这里使用suExec,因为在阅读了文档之后:
我不能为每个
$username将这个脚本的副本放入http://www.example.com/~username。脚本需要从一个位置运行,我需要在脚本中指定uid。我需要让脚本在运行时作为指定的用户名运行,而不是作为在 Apache 配置文件的虚拟主机指令中指定一次的单个用户名。每次新用户运行此脚本时更改此配置文件并重新启动 Apache 是不现实的。
当使用 setuid() 时,如何让 Perl 脚本作为 cgi-bin 运行以正确更改 uid?
【问题讨论】:
-
您的命令行用户可能有权更改其 UID,而您的网络服务器用户可能没有?
标签: perl apache cgi-bin setuid suexec