EOF when using pexpect and pxssh

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.

+6
source share
2 answers

Relative # 2: Waiting for EOF is a red herring. You do not expect EOF at login, you are waiting for a password prompt at login. pxssh kicks this error when EOF is returned when logging in with ssh without receiving a password hint. This can happen because it uses ssh -q to not receive warnings, and you get a warning from ssh. Take the ssh options that it uses and run them yourself without q:

/ usr / bin / ssh -l root 127.0.0.1

In my case, I can get this error message when ssh reports a known host violation due to the machine I am connecting to in order to change its identifier.

+5
source

I had the same error while trying to use self.expect () in pxssh. Changing ssh options by removing "-q" did not work for me.

I followed the instructions on this site by adding pexpect.EOF as one of the inputs to self.expect (). This will make the script wait until the entire string is received before exiting, when the EOF is received:

http://pexpect.readthedocs.org/en/stable/overview.html

  i = self.expect(["(?i)are you sure you want to continue connecting", original_prompt, "(?i)(?:password.*)|(?:passphrase for key)", "(?i)permission denied", "(?i)terminal type", pexpect.EOF, TIMEOUT, "(?i)connection closed by remote host"], timeout=login_timeout) 

It works great with that!

+1
source

Source: https://habr.com/ru/post/950344/


All Articles