[Vienna-pm] Escapen von Shellparametern

Stefan Weiss spaceman at foo.at
Mon Apr 28 06:34:30 PDT 2008


Hi.

Soweit ich das gesehen habe, ist die gängige Meinung im Usenet und in 
den Messageboards, dass ein verläßliches Escapen von Parametern, die der 
Shell übergeben werden (mit system() oder Backticks oä) sehr komplex bis 
kaum möglich ist. Leider ist es nicht immer (einfach) möglich, system() 
mit einer Liste von Parametern zu verwenden, und das Escapen Perl zu 
überlassen.

Zum Beispiel in diesem Fall:

my $cmd = "faxjob --from $from --faxnum $num (usw)";
print LOG "$cmd\n";
my $result = `$cmd`;

Ich möchte die komplette Befehlszeile loggen, und STDOUT lesen. Der 
grausliche Umweg über fork(), der in perlsec beschrieben wird, ist mir 
ehrlich gesagt zu umständlich - noch dazu weil ich das aus einem Daemon 
ausführe und jedes weitere händische fork()en vermeiden will.

Ich verwende jetzt stattdessen diese Funktion, um Dinge wie $from und 
$num zu escapen:

sub esc {
      local $_ = shift;
      s#([^\w./+-])#\\$1#g;
      return $_;
}

my $cmd = "faxjob --from " . esc($from)
               . " --faxnum " . esc($num)
               . ...;

Die Shell ist in meinem Fall die Bash, auf andere Shells brauche ich 
keine Rücksicht zu nehmen. Jetzt frage ich lieber zur Sicherheit noch 
einmal nach: reicht das aus, um unangenehme Überraschungen zu vermeiden, 
oder fehlt noch etwas?

lg,
stefan


-- 
LOAD"Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fhtagn!",8,1
RUN!



More information about the Vienna-pm mailing list