我有一个通过Apache或命令行调用的Perl脚本。如何使用setuid()作为cgi-bin成功运行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
在这里,因为,阅读文档后:
我不能把这个脚本的副本到
http://www.example.com/~username
每一个$username
。脚本需要从一个位置运行,我需要在脚本中指定uid
。我需要在运行时将脚本作为指定的用户名运行,而不是在Apache配置文件中的虚拟主机指令中指定的单个用户名。每当新用户运行此脚本时,更改此配置文件并重新启动Apache是不现实的。
我如何获得一个Perl脚本运行的cgi-bin目录正确地改变uid
,用setuid()
什么时候?
您的命令行用户可能有权更改其UID,您的web服务器用户可能不会? – Konerak 2011-02-14 10:26:12