Forums Neueste Beiträge
 

shellskript aus perl-skript aufrufen - Variablen uebergeben

06/06/2008 - 12:37 von Jakobus Schuerz | Report spam
Ich hab ein Problem bei der Übergabe von Variablen aus einem Perl-Skript
an ein shell-skript.

Das Skript schaut so aus:

#!/usr/bin/perl -w

use strict;
use CGI::Carp qw(fatalsToBrowser);

read(STDIN, my $Daten, $ENV{'CONTENT_LENGTH'});
my @Formularfelder = split(/&/, $Daten);
my ($Feld, $Name, $Wert);
my %Formular;
foreach $Feld (@Formularfelder) {
(my $Name, my $Wert) = split(/=/, $Feld);
$Wert =~ tr/+/ /;
$Wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$Wert =~ s/</&lt;/g;
$Wert =~ s/>/&gt;/g;
$Formular{$Name} = $Wert;
}
print "Content-type: text/html";
print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">', "";
print "<html><head><title>trackoptimizer Suchergebnis - Auswahl</title>";
print "<meta http-equiv=\"content-type\" content=\"text/html;
print "<meta name=\"author\" content=\"Jakobus Schuerz\">";
print "<meta name=\"date\" content=\"`date`\">";
print "<meta http-equiv=\"expires\" content=\"0\">";
print "</head>";
print "<body><h1>Ergebnis ihrer Suchanfrage <i></i></h1>";
print "<p><b>Startpunkt:</b> $Formular{HSTA}</p>";
print "<p><b>Archivlinie.Gleisnummer:</b> $Formular{STA}</p>";
print "<p><b>Endpunkt:</b> $Formular{HSTB}</p>";
print "<p><b>Archivlinie.Gleisnummer:</b> $Formular{STB}</p>";
exec '/usr/local/bin/trackoptimizer-sort -S html -a
"$Formular{HSTA}"-"$Formular{STA}" -b "$Formular{HSTB}"-"$Formular{STB}"';
print "</body></html>";

Da ich mich mit perl leider so gar nicht auskenne (das Skript hab ich
von de.selfhtml.org übernommen und veràndert), weiß ich nicht, wie ich
denn jetzt wirklich die Variablen $Formular{HSTA} usw. dem shellskript
übergebe.

Bitte um sachdienliche Hinweise.

lg jakob

lg jakob
 

Lesen sie die antworten

#1 Alexander Bartolich
06/06/2008 - 14:23 | Warnen spam
Jakobus Schuerz schrieb:
[...]
#!/usr/bin/perl -w
[...]
exec '/usr/local/bin/trackoptimizer-sort -S html -a
"$Formular{HSTA}"-"$Formular{STA}" -b "$Formular{HSTB}"-"$Formular{STB}"';
print "</body></html>";



exec und die verschiedenen Anführungszeichen haben in Perl die selbe
Funktion wie in der Shell, d.h. dein Code hat zwei offensichtliche
Probleme:

exec kehrt nur im Fehlerfall zurück, d.h. das nachfolgende print wird
im Normalfall nicht ausgeführt.

Innerhalb von einfachen Anführungszeichen findet keine Variablenersetzung
statt, d.h. du übergibst die Dollar-Zeichen an "trackoptimizer-sort"
statt dem Variableninhalt.

Die einfachste Lösung sieht daher so aus:

exec "/usr/local/bin/trackoptimizer-sort -S html -a '$Formular{HSTA}'-'$Formular{STA}' -b '$Formular{HSTB}'-'$Formular{STB}'";

Allerdings bleibt da das nicht-offensichtliche Problem mit geschach-
teltem Quoting. Wenn etwa der Wert von $Formular{HSTA} aus den Zeichen

'& rm -rf /* & echo '

besteht, dann wird Perl folgendes Skript an die Shell übergeben:

/usr/local/bin/trackoptimizer-sort -S html -a ''& rm -rf /* & echo '...

Die bessere Lösung sieht daher so aus:

exec
'/usr/local/bin/trackoptimizer-sort',
'-S',
'html',
'-a',
"$Formular{HSTA}-$Formular{STA}",
'-b',
"$Formular{HSTB}-$Formular{STB}";

Damit ruft Perl immer direkt "trackoptimizer-sort" auf, ohne dass die
Shell kreativ werden kann.

Netiquette considered harmful.

Ähnliche fragen