[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