I am trying to run code in Interacting with SSH via Pexpect and the coarse forced SSH passwords with Pxssh sections from chapter 2 of Violent Python . Using both child.expect() and pxssh , I get similar EOF errors.
Running these commands from the Python console:
import pexpect connStr = "ssh root@127.0.0.1 " child = pexpect.spawn(connStr) ret = child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"])
I get this output:
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', ' root@127.0.0.1 '] 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
And by running these commands using pxssh :
import pxssh s = pxssh.pxssh() s.login("127.0.0.1", "root", "1234")
I get this output:
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
I get similar results when I replace 127.0.0.1 with other hosts and try different combinations of username and password.
pexpect documentation suggests using expect(pexpect.EOF) to avoid expect(pexpect.EOF) EOF exception. Indeed, when I do the following:
connStr = "ssh root@127.0.0.1 " child = pexpect.spawn(connStr) print child.expect(pexpect.EOF)
Result 0 .
But the following questions remain:
- I am confused by the syntax of the book:
child.expect([pexpect.TIMEOUT, ssh_newkey, "[P|p]assword:"]) . Why do we pass expect() ? What should this list contain? - How to use
expect(pexpect.EOF) as stated in the documentation when using pxssh? - Why is the code in the book not working properly? Has anything changed in the pexpect library since the book was published? Is it because I'm on OS X?
I have Python 2.7 and pexpect 2.4 running on Mac OS X 10.8.4.