У меня есть Perl-скрипт, который вызывается через Apache или из командной строки.
В целях тестирования я передаю ему имя пользователя, с которым должен работать скрипт 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
и никогда не меняется.
Не думаю, что смогу использовать suExec
здесь, потому что после прочтения документации:
Я не могу поместить копию этого скрипта в http://www.example.com/~username
для каждого $username
. Скрипт должен запускаться из одного места, и мне нужно указать uid
из скрипта.
Мне нужно, чтобы скрипт выполнялся как указанное имя пользователя во время выполнения, а не как одно имя пользователя, указанное один раз в директиве виртуального хоста в файле конфигурации Apache. Изменение этого файла конфигурации и перезапуск Apache каждый раз, когда новый пользователь запускает этот скрипт, нереально.
Как мне заставить Perl-скрипт работать как cgi-bin для правильного изменения uid
при использовании setuid()
?