in reply to Specifying a shell for use with Backticks

There's no way of overriding backtick (or qx) that I know of ... and by default it should be using some bourne shell variant not csh (but I guess it all depends on what type of wackiness your system was in when perl was built - I've seen plenty of systems where sh was really csh). I think you're going to be better off with fork and exec -- modified from the code in perlsec:

#!/usr/bin/perl use English '-no_match_vars'; my $content = mysystem( "/bin/ls", "-l" ); print $content; sub mysystem { my @args = @_; my $pid; my $content; die "Can't fork: $!" unless defined($pid = open(KID, "-|")); if( $pid ) { # parent while (<KID>) { $content .= $_; } close KID; $content; } else { my @temp = ($EUID, $EGID); my $orig_uid = $UID; my $orig_gid = $GID; $EUID = $UID; $EGID = $GID; # Drop privileges $UID = $orig_uid; $GID = $orig_gid; # Make sure privs are really gone ($EUID, $EGID) = @temp; die "Can't drop privileges" unless $UID == $EUID && $GID eq $EGID; $ENV{PATH} = "/bin:/usr/bin"; # Minimal PATH. # Consider sanitizing the environment even more. exec @args or die "can't exec: $!"; } }
Since no shell is being used, just ensure you have your environment the way you want before calling the code (and please beef this sample up ... it does no error checking nor return value checking).

-derby