I have a Perl script that is called either via Apache or on the command-line.
For testing purposes, I pass it the username I want the Perl script to operate with, and use POSIX::setuid
to set the uid
.
If I run the script from the command line, then the uid
is set properly:
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";
}
The command-line output shows the correct uid
of the specified $username
, instead of the uid
of the test account that started running the script.
If I call the script via Apache, then the uid
remains set to the id of the apache
user, and never changes.
I don't believe I can use suExec
here, because, after reading the documentation:
I can't put a copy of this script into
http://www.example.com/~username
for every$username
. The script needs to run from one location, and I need to specify theuid
from within the script.I need to have the script run as the specified username at runtime, and not as a single username specified once in a virtual host directive in an Apache configuration file. Changing this configuration file and restarting Apache every time a new user runs this script is not realistic.
How do I get a Perl script running as a cgi-bin to change the uid
correctly, when using setuid()
?