Como executar com êxito o script Perl com setuid () quando usado como cgi-bin?

Eu tenho um script Perl que é chamado via Apache ou na linha de comando.

Para fins de teste, transmito o nome de usuário com o qual quero que o script Perl funcione e usoPOSIX::setuid para definir ouid.

Se eu executar o script na linha de comando, o comandouid está definido corretamente:

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"; }

A saída da linha de comandos mostra o corretouid do especificado$username, ao invés deuid da conta de teste que começou a executar o script.

Se eu chamar o script via Apache, então ouid permanece definido como o ID doapache usuário e nunca muda.

Não acredito que posso usarsuExec aqui, porque, depois de ler a documentação:

Não consigo colocar uma cópia desse script emhttp://www.example.com/~username para cada$username. O script precisa ser executado em um local e eu preciso especificar ouid de dentro do script.

Eu preciso que o script seja executado como o nome de usuário especificado em tempo de execução, e não como um nome de usuário único especificado uma vez em uma diretiva de host virtual em um arquivo de configuração do Apache. Alterar esse arquivo de configuração e reiniciar o Apache toda vez que um novo usuário executa esse script não é realista.

Como faço para obter um script Perl executando como um cgi-bin para alterar ouid corretamente, ao usarsetuid()?

questionAnswers(1)

yourAnswerToTheQuestion