Gero Takke: Ausgabe von aufgerufenen Programmen

morgen liebe gemeinde ^_^

Ich versuche, ein Perl Skript zu schreiben, das per open () ein anderes Programm aufruft (ping um genau zu sein), und möchte die Ausgabe von diesem Programm, die ja zum stdout geschickt wird, welcher in meinem Falle per CGI zurück an den Browser geht, eben nicht dorthin haben, sondern irgendwohin, wo ich sie abfragen kann (hier würde sich natürlich eine variable anbieten ;)

ich habe schon eine Lösung gefunden, und zwar indem ich per shell die Ausgabe in eine Datei schreibe
also:

open (PING,'/bin/bash -c "ping -c 1 ipadresse > datei"');

und dann eben das Zeug aus der Datei auslese, allerdings bin ich damit nicht zufrieden, weil ich
1. von einer bash ausgehe
und 2. Die Ausgabe erst auf die Festplatte geschrieben wird (...lahm...)

es wär schön, wenn ihr mir sagen könntet, wie ich die Ausgabe von open () irgendwie umleiten kann, direkt in perl...

danke im voraus

der gero

  1. Hallo Gero ;)

    Die Lösung ist wie folgt:
    man setze statt einen Ausgabefilter fest, das geschieht mit einer Pipe am ende des zweiten Parameters von open:

    open (PING,"/bin/ping -c 1 192.168.11.2")

    nun sind alle Ausgaben von dem Programm im File-Descriptor PING lesbar, d.h.

    while (<PING>)
    {
    printf ($_);
    }
    gibt die dinger wieder aus.

    (Dies nur für die Leute, die das auch interessiert =)

    bis demnächst

    ich selbst.

    1. Hallo Gero

      Hallo Gero ;)
      Die Lösung ist wie folgt:

      Zur Info fuer dich und alle: so etwas finde ich eigentlich eine prima Sache. Wer Fragen hier gepostet hat und selber eine Antwort gefunden hat, darf diese, sofern die Frage ansonsten immer noch im Raum steht, gerne auch selber beantworten hier. Denn wir sind ja nicht nur gespannt auf Fragen, sondern immer auch erfreut ueber Loesungen ;-)

      viele Gruesse
        Stefan Muenz

    2. open (PING,"/bin/ping -c 1 192.168.11.2")
      nun sind alle Ausgaben von dem Programm im File-Descriptor PING lesbar, d.h.

      Hallo Gero,

      was vermutlich auch gehen müßte (und vielleicht naheliegender ist als eine pipe ;-), ist folgende Konstruktion:

      my $ergebnis = /bin/ping -c 192.168.11.2

      Das schreibt die Ausgabe des Kommandos in die Variable $ergebnis - genau so, wie man das auch in einer UNIX-shell tun würde.

      Gegenüber einer shell noch komfortabler ist:

      my @ergebnis = /bin/ping -c 192.168.11.2

      wobei dann der array @ergebnis die einzelnen Zeilen der Ausgabe enthält (falls man z. B. bloß die erste oder letzte Zeile haben will, braucht man das Ergebnis nicht mehr zu parsen).

      Mich würde zudem interessieren, ob die pipe-Lösung auch auf Windows läuft und nicht nur auf UNIX. Die "backticks" scheinen auf beidem zu funktionieren.

      1. Hallo!

        my $ergebnis = /bin/ping -c 192.168.11.2

        Das schreibt die Ausgabe des Kommandos in die Variable $ergebnis - genau so, wie man das auch in einer UNIX-shell tun würde.

        Yepp, man nennt es Kommandosubstitution. Ich moechte in diesem Zusammenhang auf ein Problem hinweisen, das ich mal hatte. Siehe dazu <../../sfarchiv/1999_2/t02844.htm> (das Problem) und <../../sfarchiv/1999_2/t03170.htm> (die Loesung). Wenn eine bestimmte Einstellung fehlt, kommt der MS-IIS4 nicht mit der Umleitung der Ausgabe (I/O Redirection). Leider gibt es diese Einstellung defaultmaessig nicht, und dann hat MS in seiner unendlichen Weisheit die Einstellungen fuer den IIS4 nicht etwa in der Registry abgelegt (in ASCII files ja sowieso nicht), nein das waere ja viel zu einfach! Jetzt muss man die Einstellungen in der sogenannten Metabase machen. Na gut, koennte man die ja aendern. Aber nicht so voreilig! Bitte erst den WSH (Windows Scripting Host) installieren, sonst kann man die nicht anfassen! All das ausfuehrlich auf http://www.whitecrow.demon.co.uk/steve/perlfaq/io.html. Microsoft!!!*&%*$^!~

        Mich würde zudem interessieren, ob die pipe-Lösung auch auf Windows läuft und nicht nur auf UNIX. Die "backticks" scheinen auf beidem zu funktionieren.

        Warum nicht? Allerdings wird evtl. auch hier das oben genannte Problem auftreten. Das ist aber ein rein IIS4-spezifisches Problem (nur Version 4). Auf der WinNT-Kommandozeile funzt das wunderbar. (Pipe nicht getestet, aber Kommandosubstitution auf jeden Fall.)

        Calocybe