Befehl wie in der Komandozeile ausführen
Reto Strub
- perl
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
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: 0Weshalb 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
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
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.
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
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
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
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
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
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