EOF bei Verwendung von pexpect und pxssh

Ich versuche, den Code in der auszuführenInteraktion mit SSH durch Pexpect undBrutale Erzwingung von SSH-Passwörtern mit Pxssh Abschnitte aus Kapitel 2 vonHeftige Pythonschlange. Beides verwendenchild.expect() undpxssh Ich erhalte ähnliche EOF-Fehler.

Ausführen dieser Befehle über die Python-Konsole:

import pexpect
connStr = "ssh [email protected]"
child = pexpect.spawn(connStr)
ret = child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"])

Ich bekomme diese Ausgabe:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1316, in expect
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1330, in expect_list
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1401, in expect_loop
    raise EOF (str(e) + '\n' + str(self))
EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform.
<pexpect.spawn object at 0x10180c550>
version: 2.4 ($Revision: 516 $)
command: /usr/bin/ssh
args: ['/usr/bin/ssh', '[email protected]']
searcher: searcher_re:
    0: TIMEOUT
    1: re.compile("Are you sure you want to continue connecting")
    2: re.compile("[P|p]assword:")
buffer (last 100 chars): 
before (last 100 chars): 
after: <class 'pexpect.EOF'>
match: None
match_index: None
exitstatus: 255 
flag_eof: True
pid: 12122
child_fd: 4
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

Und führen Sie diese Befehle mitpxssh:

import pxssh
s = pxssh.pxssh()
s.login("127.0.0.1", "root", "1234")

Ich bekomme diese Ausgabe:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pxssh.py", line
 196, in login
    i = self.expect(["(?i)are you sure you want to continue connecting", original_prompt, "(?i)(?:pas
sword)|(?:passphrase for key)", "(?i)permission denied", "(?i)terminal type", TIMEOUT, "(?i)connectio
n closed by remote host"], timeout=login_timeout)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1316, in expect
    return self.expect_list(compiled_pattern_list, timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1330, in expect_list
    return self.expect_loop(searcher_re(pattern_list), timeout, searchwindowsize)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pexpect.py", li
ne 1401, in expect_loop
    raise EOF (str(e) + '\n' + str(self))
EOF: End Of File (EOF) in read_nonblocking(). Empty string style platform.
<pxssh.pxssh object at 0x1016bff90>
version: 2.4 ($Revision: 516 $)
command: /usr/bin/ssh
args: ['/usr/bin/ssh', '-q', '-l', 'root', '127.0.0.1']
searcher: searcher_re:
    0: re.compile("(?i)are you sure you want to continue connecting")
    1: re.compile("[#$]")
    2: re.compile("(?i)(?:password)|(?:passphrase for key)")
    3: re.compile("(?i)permission denied")
    4: re.compile("(?i)terminal type")
    5: TIMEOUT
    6: re.compile("(?i)connection closed by remote host")
buffer (last 100 chars): 
before (last 100 chars): 
after: <class 'pexpect.EOF'>
match: None
match_index: None
exitstatus: None
flag_eof: True
pid: 12136
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

Ich erhalte ähnliche Ergebnisse, wenn ich ersetze127.0.0.1 mit anderen Hosts und probieren Sie andere Kombinationen aus Benutzername und Passwort.

DasErwarten Sie Dokumentation schlägt vor, mitexpect(pexpect.EOF) um zu vermeiden, dass die EOF-Ausnahme generiert wird. In der Tat, wenn ich Folgendes tue:

connStr = "ssh [email protected]"
child = pexpect.spawn(connStr)
print child.expect(pexpect.EOF)

Das Ergebnis ist0.

Folgende Fragen bleiben jedoch offen:

Die Syntax des Buches verwirrt mich:child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"]). Warum übergeben wir eine Liste anexpect()? Was soll diese Liste enthalten?Wie nutze ichexpect(pexpect.EOF), wie in der Dokumentation angegeben, wenn pxssh verwendet wird?Warum funktioniert der Code im Buch nicht richtig? Hat sich in der pexpect-Bibliothek seit der Veröffentlichung des Buches etwas geändert? Liegt es daran, dass ich unter OS X bin?

Ich habe Python 2.7 und pexpect 2.4 unter Mac OS X 10.8.4.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage