@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()?

Ответы на вопрос(1)

Ваш ответ на вопрос