[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