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