[Vienna-pm] Escapen von Shellparametern
Wolfgang Laun
Wolfgang.Laun at thalesgroup.com
Mon Apr 28 07:19:56 PDT 2008
Mit sub esc wie gezeigt:
for my $ifrom ( 0x20..0x7e, 0xa0..0xff ){
my $from = chr( $ifrom );
my $cmd = "echo -n " . esc($from);
my $res = `$cmd`;
if( $from ne $res ){
print "i='$from', o='$res'\n";
}
}
mfgWL
Stefan Weiss wrote:
>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
>
>
>
>
More information about the Vienna-pm
mailing list