¿Cómo ejecutar correctamente el script Perl con setuid () cuando se usa como cgi-bin?

Tengo un script de Perl que se llama a través de Apache o en la línea de comandos.

Para fines de prueba, le paso el nombre de usuario con el que quiero que funcione el script Perl y usoPOSIX::setuid para configurar eluid.

Si ejecuto el script desde la línea de comando, entonces eluid está configurado correctamente:

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

La salida de la línea de comandos muestra el correctouid del especificado$username, en vez deuid de la cuenta de prueba que comenzó a ejecutar el script.

Si llamo el script a través de Apache, entonces eluid permanece establecido en el id de laapache usuario, y nunca cambia.

No creo que pueda usarsuExec aquí, porque, después de leer la documentación:

No puedo poner una copia de este script enhttp://www.example.com/~username para cada$username. El script debe ejecutarse desde una ubicación, y necesito especificar eluid desde dentro del guión.

Necesito que el script se ejecute como el nombre de usuario especificado en tiempo de ejecución, y no como un solo nombre de usuario especificado una vez en una directiva de host virtual en un archivo de configuración de Apache. Cambiar este archivo de configuración y reiniciar Apache cada vez que un nuevo usuario ejecuta este script no es realista.

¿Cómo obtengo un script Perl ejecutándose como cgi-bin para cambiar eluid correctamente, cuando se usasetuid()?

Respuestas a la pregunta(1)

Su respuesta a la pregunta