我有一个通过 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()
?