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、指定された正しい が表示されます。$usernameuid
Apache 経由でスクリプトを呼び出すとuid、ユーザーの ID に設定されたままになり、変更さapacheれることはありません。
ドキュメントをsuExec読んだ後:
http://www.example.com/~usernameこのスクリプトのコピーをfor everyに入れることはできません$username。スクリプトは 1 つの場所から実行する必要がありuid、スクリプト内で from を指定する必要があります。Apache 構成ファイルの仮想ホスト ディレクティブで一度指定された単一のユーザー名としてではなく、実行時に指定されたユーザー名としてスクリプトを実行する必要があります。新しいユーザーがこのスクリプトを実行するたびに、この構成ファイルを変更して Apache を再起動するのは現実的ではありません。
uidを使用しているときに、Perl スクリプトを cgi-bin として実行して正しく変更するにはどうすればよいsetuid()ですか?