@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 $<;
}
else {
    print header(-status => 401);
    print "Could not setuid to correct uid (currently: )".getuid()."\n";
}

Вывод командной строки показывает правильныйuid&nbsp;указанного$usernameвместоuid&nbsp;тестовой учетной записи, которая запустила скрипт.

Если я вызываю скрипт через Apache, тоuid&nbsp;остается установленным на идентификаторapache&nbsp;пользователь, и никогда не меняется.

Я не верю, что могу использоватьsuExec&nbsp;здесь, потому что, прочитав документацию:

Я не могу положить копию этого скрипта вhttp://www.example.com/~username&nbsp;для каждого$username, Сценарий должен быть запущен из одного места, и мне нужно указатьuid&nbsp;изнутри сценария.

Мне нужно, чтобы скрипт выполнялся как указанное имя пользователя во время выполнения, а не как одно имя пользователя, указанное один раз в директиве виртуального хоста в файле конфигурации Apache. Изменение этого файла конфигурации и перезапуск Apache каждый раз, когда новый пользователь запускает этот скрипт, нереально.

Как мне получить скрипт Perl, работающий как cgi-bin, чтобы изменитьuid&nbsp;правильно, при использованииsetuid()?