Бэктикс для любителей. Пуленепробиваемым решением является «Safe Pipe Open» (см. «Man perlipc»). Вы выполняете свою команду в другом процессе, который позволяет вам сначала выполнить STDERR, setuid и т. Д. Преимущества: не полагается на оболочку для анализа @ARGV в отличие от open ("$ cmd $ args | "), что ненадежно. Вы можете перенаправить STDERR и изменить права доступа пользователя, не изменяя поведение вашей основной программы. Это более многословно, чем обратные пометки, но вы можете обернуть его в свою собственную функцию, например, run_cmd ($ cmd, @ args);
sub run_cmd {
my $cmd = shift @_;
my @args = @_;
my $fh; # file handle
my $pid = open($fh, '-|');
defined($pid) or die "Could not fork";
if ($pid == 0) {
open STDERR, '>/dev/null';
# setuid() if necessary
exec ($cmd, @args) or exit 1;
}
wait; # may want to time out here?
if ($? >> 8) { die "Error running $cmd: [$?]"; }
while (<$fh>) {
# Have fun with the output of $cmd
}
close $fh;
}