2016-05-06 19 views
1

Obwohl dies mein erster Versuch ist, pexpect zu verwenden, ist das python3-Skript mit pexpect ziemlich einfach; doch es scheitert.pexpect python throw error

#!/usr/bin/env python3 
import sys 
import pexpect 

SSH_NEWKEY = r'Are you sure you want to continue connecting \(yes/no\)\?' 

child = pexpect.spawn("ssh -i /user/aws/key.pem [email protected] date") 
i = child.expect([ pexpect.TIMEOUT, SSH_NEWKEY) 
if i == 1: 
    child.sendline('yes') 
print(child.before) 

Die SSH_NEWKEY ist die einzige Antwort erwarte ich, aber das Beispiel zeigt eine Liste pexpect.TIMEOUT enthält in ihm so habe ich es.

$ ./test.py 
Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 144, in read_nonblocking 
    s = os.read(self.child_fd, size) 
OSError: [Errno 5] Input/output error 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "/usr/local/lib/python3.4/site-packages/pexpect/expect.py", line 97, in expect_loop 
    incoming = spawn.read_nonblocking(spawn.maxread, timeout) 
    File "/usr/local/lib/python3.4/site-packages/pexpect/pty_spawn.py", line 455, in read_nonblocking 
    return super(spawn, self).read_nonblocking(size) 
    File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 149, in read_nonblocking 
    raise EOF('End Of File (EOF). Exception style platform.') 
pexpect.exceptions.EOF: End Of File (EOF). Exception style platform. 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "./min.py", line 15, in <module> 
    i = child.expect([ pexpect.TIMEOUT, SSH_NEWKEY ]) 
    File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 315, in expect 
    timeout, searchwindowsize, async) 
    File "/usr/local/lib/python3.4/site-packages/pexpect/spawnbase.py", line 339, in expect_list 
    return exp.expect_loop(timeout) 
    File "/usr/local/lib/python3.4/site-packages/pexpect/expect.py", line 102, in expect_loop 
    return self.eof(e) 
    File "/usr/local/lib/python3.4/site-packages/pexpect/expect.py", line 49, in eof 
    raise EOF(msg) 
pexpect.exceptions.EOF: End Of File (EOF). Exception style platform. 
<pexpect.pty_spawn.spawn object at 0x7f70ea4fbcf8> 
command: /usr/bin/ssh 
args: ['/usr/bin/ssh', '-i', '/user/aws/key.pem', '[email protected]', 'date'] 
searcher: None 
buffer (last 100 chars): b'' 
before (last 100 chars): b'Fri May 6 13:50:18 EDT 2016\r\n' 
after: <class 'pexpect.exceptions.EOF'> 
match: None 
match_index: None 
exitstatus: 0 
flag_eof: True 
pid: 31293 
child_fd: 5 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.exceptions.EOF'> 
logfile: None 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

Was fehlt mir?

CentOS 6.4 Python 3.4.3

Antwort

0

Ein EOF Fehler während erwarten Anruf angehoben wird. Dies bedeutet, dass die empfangene Antwort nicht mit SSH_NEWKEY übereinstimmt und das Ende der Datei innerhalb des Zeitlimits erreicht. Um diese Ausnahme zu fangen, sollten Sie Ihre außer Zeile zu lesen ändern:

i = child.expect([ pexpect.TIMEOUT, SSH_NEWKEY, pexpect.EOF) 

Sie können dann machen, wenn robustere:

if i == 1: 
    child.sendline('yes') 
elif i == 0: 
    print "Timeout" 
elif i == 2: 
    print "EOF" 
print(child.before) 

Dies löst nicht der Grund, warum Sie sind auf Empfang eine Antwort mit der erwarteten Zeichenfolge - es ist schwer zu wissen, ohne mehr Code zu betrachten, aber es ist wahrscheinlich, weil Sie die Antwort etwas falsch haben. Wenn Sie die SSH-Zeichenfolge manuell eingeben, sollten Sie in der Lage sein, die Antwort zu sehen, die Sie erwarten können, und diese Antwort in Ihren Code eingeben.

Sie können auch child.before nach Ihrem expect-Anruf drucken, oder drucken Sie child.read() statt Ihres Expect-Anrufs, um zu sehen, was als Antwort zurückgeschickt wird.