@Alex - последний (с CGI-фильтрованием результатов по идентификатору пользователя) на самом деле является лучшим решением этой проблемы.
я есть 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 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";
}
lt;;
}
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()
?