2017-03-02 4 views
-1

Ich habe den folgenden Code (aktualisiert pexpect enthalten):Wie erfassen ich Passwort Prompt

import sys 
import subprocess 
import pexpect 
print "0" 
ssh = subprocess.Popen("ssh -A -t [email protected] ssh -A -X [email protected]", 
     shell = True, 
     stdout = subprocess.PIPE, 
     stderr = subprocess.PIPE).communicate() 
print "1" 
child = pexpect.spawn(ssh) 
print "2" 
child.expect ('password') 
print "3" 
child.sendline ('password2') 
print "4" 
result = ssh.stdout.readlines() 
if result == []: 
     error = ssh.stderr.readlines() 
     print >>sys.stderr, "ERROR: %s" % error 
else: 
     print result 

Wenn ich es laufen, sehe ich die Null von der Passwort-Eingabeaufforderung auf dem Bildschirm gefolgt gedruckt. Die Zeile, die "One" druckt, wird nie ausgeführt und der folgende Pexpect-Code auch nicht. Ich kann das Passwort als Benutzer eingeben, aber dann hängt es. Wenn ich es mit Strg + C abbringe, erscheint das zweite Anmeldebanner mit der Aufforderung zum zweiten Passwort, bevor ich zur Eingabeaufforderung zurückkehre. Kann jemand bitte erklären, wie man die 1. Kennwortansage aufnimmt, damit das Programm das Kennwort anstelle des Benutzers senden kann? Kann mir bitte jemand erklären, warum ich die Ergebnisvariable erst bekomme, wenn ich das Programm beendet habe?

+0

Ich schlage vor, ssh_keys statt geschriebenen Passwörter zu verwenden. Dein Leben wird einfacher und gleichzeitig sicherer. – mosh442

Antwort

0

Mit Anleitung von Johannes Holmberg:

import pexpect 

prompt = "cisco_prompt" 

def start_log(): 
     global child 
     child.logfile = open("/tmp/mylog", "w") 

def stop_log(): 
     global child 
     f = open('/tmp/mylog', 'r') 
     for line in f: 
       cleanedLine = line.strip() 
       if cleanedLine: # is not empty 
         print(cleanedLine) 
     f.close() 
     child.logfile.close 

ssh_cmd = "ssh -A -t [email protected] ssh -A -X [email protected]" 
child = pexpect.spawn(ssh_cmd, timeout=30) 
print "Waiting for 1st password prompt" 
child.expect ('password') 
child.sendline ('password1') 
print "Waiting for 2nd password prompt" 
child.expect ('password') 
child.sendline ('password2') 
start_log() 
child.expect (prompt) 
child.sendline ('conf t') 
stop_log() 
start_log() 
child.expect ('(config)') 
stop_log() 
print "Ready for more code" 
child.close 
print "END" 
0

Die Passwortabfrage wird nicht in stdout geschrieben. Du brauchst etwas wie Pexpect, um es zu erfassen. Dieses Thema hat mehr Informationen: Sending a password over SSH or SCP with subprocess.Popen

Edit: In Bezug auf die aktualisierte pexpect Code, zunächst, wenn Sie in der Dokumentation zu subprocess lesen, werden Sie, dass() wartet siehe kommunizieren für den Prozess zu beenden, das ist, warum Ihr Programm hängt, bis Sie die SSH-Sitzung beenden. Und Ihr Aufruf an pexpect.spawn sieht falsch aus, es erwartet eine Zeichenfolge, kein Popen-Objekt. Sie brauchen hier keinen Subprozess.

+0

Ich habe meinen Code (oben) angepasst, um Ihren Vorschlag aufzunehmen, aber ich habe immer noch die gleichen Probleme. –

+0

@John_F: Ich habe meine Antwort aktualisiert. –