piet: kein gltiger Rückgabewert von shell befehl (Linux)

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

  1. Hello,

    unter welchem User wird das Perl-Script denn ausgeführt?

    Liebe Grüße aus Syburg bei Dortmund

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
  2. 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

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".