我有一个通过 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";
}
命令行输出显示uid指定的正确$username,而不是uid开始运行脚本的测试帐户的正确。
如果我通过 Apache 调用脚本,那么uid其余部分设置为apache用户的 id,并且永远不会更改。
我不相信我可以suExec在这里使用,因为在阅读了文档之后:
我不能
http://www.example.com/~username为每个$username. 脚本需要从一个位置运行,我需要uid在脚本中指定 from。我需要让脚本在运行时作为指定的用户名运行,而不是作为在 Apache 配置文件的虚拟主机指令中指定一次的单个用户名。每次新用户运行此脚本时更改此配置文件并重新启动 Apache 是不现实的。
使用时如何让 Perl 脚本作为 cgi-bin 运行以uid正确更改setuid()?