Reto Strub: Befehl wie in der Komandozeile ausführen

Hallo zusammen

Ich versuche in meinem Perlscript einen Befehl auf die Komandozeile auszugeben.

Ich habe folgendes versucht:
  my $Ver = qx(cinternet --version);

Das funktioniert. In der Variable $Ver steht dann die Version des cinternet.

Wenn ich allerdings folgendes eingebe:
  my $Status = qx(cinternet -i ippp0 -p Green.ch -s);

Dann kommt nichts in die Variable. Gebe ich die selbe Zeile in ein Konsolenfenster, bekomme ich 3 Zeilen zurück:
  status: disconnected
  action-flags: 0x01
  number-of-links: 0

Weshalb steht in meiner Variable nichts ???

Könnt Ihr mir da mal weiterhelfen ???

Danke
Reto

  1. Hallo zusammen

    Moin!

    [...]

    »»

    Wenn ich allerdings folgendes eingebe:
      my $Status = qx(cinternet -i ippp0 -p Green.ch -s);

    Dann kommt nichts in die Variable. Gebe ich die selbe Zeile in ein Konsolenfenster, bekomme ich 3 Zeilen zurück:
      status: disconnected
      action-flags: 0x01
      number-of-links: 0

    Weshalb steht in meiner Variable nichts ???

    Nichts? Vielleicht steht in deinem _Skalar_ ja ein _Array_? Probier doch mal

    @status = qx(...);

    Könnt Ihr mir da mal weiterhelfen ???

    (Ich hoffe das funktioniert auch tatsächlich, ich nehme für sowas immer Backticks.)

    Danke
    Reto

    Robert

    1. Hi!

      Wichtig sind auch die Rechte. Die sind evtl. im Skript anders als auf der Kommandozeile...

      Vielleicht hilft Dir:

      http://forum.de.selfhtml.org/archiv/2003/1/33893/

      Stefan

      1. Moin

        Vielleicht hilft Dir:
        http://forum.de.selfhtml.org/archiv/2003/1/33893/

        Leider bin ich noch nicht so toll mit Linux ... Könnte mir jemand erklären, was es mit dem set uid auf sich hat ???

        Gruss Reto

        PS: In diesem Artikel geht's genau um das, was ich versuche zu kreieren.

  2. Halihallo Reto

    Wenn ich allerdings folgendes eingebe:
      my $Status = qx(cinternet -i ippp0 -p Green.ch -s);
    Dann kommt nichts in die Variable.

    Nichts == undef? - Dann schlug der Befehl fehl. Falls er auf der
    Konsole funktioniert, könnte dies damit zu erklären sein, dass dein
    Script nicht die benötigten Rechte zum Ausführen des Befehls hat,
    aber das ist eher unwahrscheinlich, da dein erstes Beispiel
    funktionierte.

    Gebe ich die selbe Zeile in ein Konsolenfenster, bekomme ich 3 Zeilen zurück:
      status: disconnected
      action-flags: 0x01
      number-of-links: 0

    Zweite Theorie: Backtick-Operands, wie qx, geben dir nur die
    Standardausgabe zurück. STDERR wird nicht zurückgegeben. Falls also
    die drei Zeilen, die du auf der Konsole erhälst vom cinternet
    Programm an STDERR gesendet werden, wirst du dies im Script eben
    nicht in der Variablen manifestiert bekommen.
    Hier würde sich folgende Lösung anbieten:

    $ret = qx(cinternet -i ippp0 -p Green.ch -s 2>&1)

    oder aber über IPC::Open3

    ---

    perldoc perlop
    perldoc perlipc
    perldoc IPC::Open3

    Viele Grüsse

    Philipp

    --
    The only program that runs perfectly every time, is a virus.
    1. Hallo Philipp
      Ist ne gute Idee ...

      $ret = qx(cinternet -i ippp0 -p Green.ch -s 2>&1)

      Nun bekomm ich wenigstens was ;) Auch wenn's nicht das ist, was ich will:
        error: connection to smpppd failed (use --verbose for more information)

      mit verbose-mode kommt dann folgendes:
        warning: can't read /etc/smpppd-c.conf: Permission denied trying to connect local smpppd
        error: could not connect local smpppd: Permission denied
        error: trying to connect to smpppd on gateway but no defaultroute is set
        error: connection to smpppd failed

      Irgend wie könnte das doch ein berechtigungsproblem sein ??? Wenn ich so die ausdrücke "Permission denied" sehe ... oder nicht ???

      Was kann man dagegen machen ???

      Gruss Reto

  3. Jungs ich hab's geschaft ... ;)

    ich hab mal das mit dem setuid versucht ... und siehe da ... es läuft.

    Nun ... ist das richtig, dass nun theoretisch jeder auf das Programm cinternet root-zugriff hat ???

    Dank an ALLE
    Reto

    1. Halihallo Reto

      ich hab mal das mit dem setuid versucht ... und siehe da ... es läuft.
      Nun ... ist das richtig, dass nun theoretisch jeder auf das Programm cinternet root-zugriff hat ???

      Ja (diese Antwort zu deiner eigenen Sicherheit). Nun, jain. Falls
      ein anderer User über die Shell als "normaler Benutzer" eingeloggt
      ist, müsste setsid() auf root eigentlich mit einer Fehlermeldung
      quittieren, denn kein normaler User darf auf normalem Weg zu
      Administratorrechten kommen (es gibt Ausnahmen, wie z.B. Programme
      unter su_exec [super-user exec]). Aber es ist hier extreme Vorsicht
      geboten, also beantworte ich deine Frage zu deinem Schutz mit einem
      ja. Teste es aus, oder noch besser: versuche einfach den Zugriff
      auf das Programm möglichst einzuschränken und erlaube am besten
      keinerlei externe Eingaben (z.B. Daten aus einem Formularfeld oder
      Programmparameter ungeprüft (Stichwort tainted Modus) an das
      cinternet Programm zu übergeben).

      Viele Grüsse

      Philipp

      --
      The only program that runs perfectly every time, is a virus.
  4. Hi,

    Weshalb steht in meiner Variable nichts ???

    Weil du nur den Rückgabewert in der Variable stehen hast.

    Wenn du die Ausgabe lesen willst musst du das Programm über eine Pipe mit open() öffnen. Und dann wie aus einer Datei auslesen.

    Für Informationen über open, such mit google etc., perldoc -f open /perldoc perlopentut, oder schau in selfhtml. Wenn du nichts findest frag nochmal.

    Grüße Andres Freund

    1. Halihallo Andres

      Weshalb steht in meiner Variable nichts ???
      Weil du nur den Rückgabewert in der Variable stehen hast.

      Rückgabewert? - Nein, der ganze Output (STDOUT) des Programmes.
      perldoc perlop

      Wenn du die Ausgabe lesen willst musst du das Programm über eine Pipe mit open() öffnen. Und dann wie aus einer Datei auslesen.

      Geht auch, aber in diesem Falle ist es über Backticks wirklich
      einfacher und schneller zu lösen. Müssen tut man nicht, es geht
      ebenfalls über Backtick-Operatoren (z.B. qx oder `).

      Viele Grüsse

      Philipp

      --
      The only program that runs perfectly every time, is a virus.