У меня есть 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()
?