Verwenden Teilprozess, um ein Kennwort senden
Ich bin versucht, python-subprocess-Modul, log-in, um eine sichere ftp-site, und dann schnappen Sie eine Datei. Allerdings habe ich immer aufgehängt auf nur versuchen, das Kennwort zu senden, wenn es angefordert wird. Ich habe bisher folgenden code:
from subprocess import Popen, PIPE
proc = Popen(['sftp','user@server', 'stop'], stdin=PIPE)
proc.communicate('password')
Diese noch nicht bei der Passwort-Eingabeaufforderung. Wenn ich das Passwort eingeben, manuell geht es dann um die ftp-site, und dann gibt das Passwort auf der Kommandozeile. Ich habe Menschen gesehen, die vorschlagen, mit pexpect aber lange Rede kurzer Sinn ich brauche eine standard-library-Lösung. Ist es irgendwie mit den Teilprozess und/oder andere stdlib? Was ich vergessen oben?
InformationsquelleAutor der Frage The Jug | 2010-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vielleicht sollten Sie eine erwarten-wie Bibliothek statt?
Beispielsweise Pexpect (Beispiel). Es gibt andere, ähnlich python-Bibliotheken.
InformationsquelleAutor der Antwort codeape
Versuchen
Funktionieren sollte.
Was Sie beschreiben, klingt wie
stdin=None
wo der Kindprozess erbt die stdin des Elternteils (Ihr Python-Programm).InformationsquelleAutor der Antwort Aaron Digulla
Versuchen mit input='Passwort' in der Kommunikation, die für mich gearbeitet.
InformationsquelleAutor der Antwort 0038lana
Ich würde empfehlen, die Abschaffung der Teilprozess Ansatz und mit dem paramiko-Paket für den sftp-Zugriff.
InformationsquelleAutor der Antwort mikerobi
Verwenden
Paramiko
für SFTP. Für alles andere, das funktioniert:InformationsquelleAutor der Antwort Matthew Moisen
Das gleiche problem plagte mich für eine Woche. Ich hatte zu senden ein Passwort vom Benutzer durch Eingabe Teilprozess sicher, weil ich versucht habe, zu vermeiden, die Einführung einer Befehls-injection-Schwachstelle. Hier ist, wie ich das problem gelöst mit ein wenig Hilfe von einem Kollegen.
Den .warten(timeout=int) war die wichtigste Komponente, weil es dem Benutzer ermöglicht, feed input auf stdin. Ansonsten, der timeout ist standardmäßig auf 0 und lässt dem Nutzer keine Zeit eingeben Eingabe, die folglich Ergebnisse in Keiner oder null-string. Hat mich für IMMER, um dies herauszufinden.
Für den wiederholten Gebrauch-Fälle, wo Sie wissen, Sie müssen dies tun, mehrere Male, können Sie überschreiben die popen-Funktion und verwenden Sie es als eine private Methode, wie mir gesagt wurde, durch die gleichen Programmierer ist die beste Praxis, wenn Sie erwarten, jemand anderes zu werden, um die Aufrechterhaltung der code später auf und wenn Sie nicht wollen, um Durcheinander mit es.
Ist es wichtig, zu entfernen stdout=subprocess.ROHR, wenn der Benutzer wird zur Eingabe aufgefordert. Ansonsten, der Prozess scheint zu hängen, für 60 Sekunden, und der Benutzer nicht aufgefordert, noch begreifen Sie, sind Sie erwartet, geben Sie ein Passwort ein. Die Standardausgabe wird natürlich gehen Sie auf die shell-Fenster und ermöglichen es dem Benutzer zu übergeben, input zu popen().
Auch, nur um zu erklären, warum Sie wieder proc_h.poll() == os.EX_OK, ist, dass es gibt 0 zurück, wenn der Befehl erfolgreich ausgeführt wurde. Dies ist nur c-style-beste-Praxis für, wenn Sie wollen, um die Rückgabe von system-Fehler-codes im Falle, dass die Funktion fehlschlägt, während die Buchhaltung für die Tatsache, dass return 0 behandelt werden als "false" durch den Dolmetscher.
InformationsquelleAutor der Antwort Dark Singularity
Dies ist eine Reine Python-Lösung verwenden, erwarten Sie nicht pexpect.
Wenn auf Ubuntu müssen Sie zunächst installieren Sie erwarten:
Python 3.6 oder höher:
InformationsquelleAutor der Antwort Duke Dougal