kein gltiger Rückgabewert von shell befehl (Linux)
piet
- perl
0 Tom2 Alexander (HH)
Hallo,
ich öffne mit einerm Perlscript eine ISDN-Verbindung. Danach warte ich 10 Sekunden und frage die Dynamische IP-Adresse ab.
......
my $ipadr = exec /sbin/ifconfig | grep ippp0 -A 1 | grep "inet Adresse" | cut -d: -f2 | cut -d" " -f1
;
chomp($ipadr);
print "http://$ipadr";
Die Codezeilen kommen genau hintereinander.
Wenn ich mein Programm starte bekomme ich keine IP-Adresse.
Wenn ich die obigen Zeilen bei verbundenem ISDN-Kanal auf der Konsole ausführe, bekomme ich eine IP.
Es hat aber schon einmal beides funktioniert, nur ich weiß nicht warum ??
Gruß
piet
Hello,
unter welchem User wird das Perl-Script denn ausgeführt?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Moin Moin!
my $ipadr =
exec /sbin/ifconfig | grep ippp0 -A 1 | grep "inet Adresse" | cut -d: -f2 | cut -d" " -f1
;
chomp($ipadr);print "http://$ipadr";
Oh je! Für grep und cut brauchst Du keine externen Programme, das kann Perl von sich aus. Dein Script setzt außerdem voraus, dass ifconfig deutsche Meldungen ausgibt, das passiert aber nur, wenn das Environment passend eingestellt ist. Und du läßt Dir Daten aller Interfaces ausgeben, willst aber nur ippp0 wissen. Und was soll das exec?
my $ipadr;
open PIPE,'/sbin/ifconfig ippp0' or die "ifconfig failed: $!";
while (<PIPE>) {
if (/\binet.*?:(\d+\.\d+\.\d+\.\d+)/) {
$ipadr=$1;
last;
}
}
close PIPE;
if ($ipadr) {
print "http://$ipadr";
} else {
die "ISDN offline";
}
Abhängig von Deiner Distribution kannst Du Dir das Leben noch DEUTLICH leichter machen, wenn Du dich in die ifup/ifdown-Scripte einklinkst (typischerweise /etc/ppp/ip-up und /etc/ppp/ip-down, siehe http://ppp.samba.org/ppp/pppd.html). Dort kannst Du im Up-Script die IP-Adresse in eine Datei schreiben (z.B. echo "$4" > "/var/run/$1.addr") und im Down-Script die Datei wieder löschen (rm -f "/var/run/$1.addr").
Wann immer Du auf deine ISDN-IP-Adresse zugreifen willst, versuchst Du /var/run/ippp0.addr zu öffnen. Geht das schief, ist ISDN down, ansonsten enthält die Datei die IP-Adresse:
open FILE,'<','/var/run/ippp0.addr' or die "ISDN down ($!)";
my $ipadr=<FILE>;
close FILE;
print "http://$ipadr";
Oder ganz ohne Perl in Shell-Scripten:
ipadr=$(cat /var/run/ippp0.addr 2> /dev/null)
if [ "$ipadr" != "" ] ; then
echo "http://$ipadr"
else
echo "ISDN offline" 1>&2
exit 1
fi
Alexander