Python - subprocess.Popen - ssh -t user@host "service --status-all"
Ich habe gelesen, ein paar Beispiele, aber keiner von Ihnen arbeiten für diese spezifische Aufgabe.
Python-code:
x = Popen(commands, stdout=PIPE, stderr=PIPE, shell=True)
print commands
stdout = x.stdout.read()
stderr = x.stderr.read()
print stdout, stderr
return stdout
Ausgabe:
[user@host]$ python helpers.py
['ssh', '-t', 'user@host', ' ', "'service --status-all'"]
usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
Warum bin ich immer diese Fehlermeldung?
Mit os.popen(...) es funktioniert, es führt zumindest ich kann Sie aber nicht abrufen, die Ausgabe der remote-Befehl über SSH-tunnel.
Die Ausgabe legt nahe, dass Sie nicht bestanden genügend/die richtigen Parameter für den Befehl.
Entfernen Sie die Leerzeichen-Element, und entfernen Sie die Anführungszeichen um den letzten parameter.
btw, sind Sie mit public-key-Authentifizierung? oder Passwort-Authentifizierung?
Erwägen Sie die Verwendung
unrelated: verwenden Sie
Entfernen Sie die Leerzeichen-Element, und entfernen Sie die Anführungszeichen um den letzten parameter.
btw, sind Sie mit public-key-Authentifizierung? oder Passwort-Authentifizierung?
Erwägen Sie die Verwendung
paramiko
/ fabric
.unrelated: verwenden Sie
stdout, stderr = x.communicate()
statt stdout = x.stdout.read(); stderr = x.stderr.read()
. Letzteres kann zu einem deadlock führen, wenn commands
erzeugt genug Leistung. Eine alternative ist die Verwendung von verschiedenen threads zu Lesen, stdout/stderr gleichzeitig oder verwenden select
oder fnctl
Module (Unix)InformationsquelleAutor Torxed | 2013-01-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, Ihre Liste Befehle ist falsch:
Außerdem, ich glaube nicht, sollten Sie pass
shell=True
wenn Sie übergeben eine Liste zuPopen
.z.B. entweder:
oder so:
aber nicht dieses:
Schließlich, gibt es eine Komfort-Funktion zum aufteilen einer Zeichenkette in eine Liste der gleichen Art und Weise Ihren shell:
zurück:
Oh, und nicht unhöflich zu noob-Fragen.. Da einige von uns Gehirn friert auch tho wir haben programmiert in Python bald 10 Jahre und nicht abgeholt auf einmal ist es passiert, gibt mir Hoffnung in die Menschheit 🙂 Also, wenn ich könnte, würde ich geben Ihnen mehr Punkte für eine SCHÖNE gute Antwort! (Kann nicht markieren Sie Ihre Antwort als Lösung noch, 1min oder so)
Können Sie erklären, warum es notwendig ist, zu brechen, bis Sie einen einzelnen Befehl in jedem Stück (durch Leerzeichen getrennt) zu übergeben, wie diese? commands = ['ssh', '-t', 'user@host', "service --status-all"]
Das ist das, was die shell in der Regel für Sie tut. In python, wir sind einfach nur ein wenig deutlicher. Natürlich abhängig von der saite, können wir in der Regel verwenden
shlex.split
zu split die Zeichenfolge als die shell wäre für uns, wenn Sie lieber.InformationsquelleAutor mgilson