2016-05-06 9 views
1

これは私の最初の試みであるpexpectですが、pexpectを使ったpython3スクリプトはかなりシンプルです。それでも失敗する。pexpect python throwエラー

#!/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) 

SSH_NEWKEYは私が期待してい唯一の応答であるが、私はそれを使用しての例では、それにpexpect.TIMEOUTを含むリストを示しました。

$ ./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 

私は何が欠けていますか?

のCentOS 6.4 のpython 3.4.3

答えて

0

アンEOFエラーがあなたの期待通話中に提起されています。これは、受信した応答がSSH_NEWKEYと一致せず、タイムアウト時間内にファイルの終わりに達することを意味します。この例外をキャッチするには、読み取りにラインを除いて、あなたを変更する必要があります。

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

その後、作ることができ、あなたのより強固な場合:

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

これは、あなたが受けている理由の背後にある理由を解決しません期待される文字列の応答 - より多くのコードを見ることなく知るのは難しいですが、あなたは少しだけ間違った応答をしている可能性が高いです。手動でSSH文字列を入力する場合は、期待どおりの応答を見て、この応答をコードに入力できるはずです。あなたの期待の

あなたが呼び出す、または印刷child.read(期待した後、あなたはまた、child.beforeを印刷することができます

代わりは応答として送り返されているかを確認するために呼び出します。

関連する問題