我有一個通過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