2015-11-03 68 views
1

我只是想建立一个脚本从基于UNIX的设备获取一些输出,在这里你可以找到我的代码:的Python Pexpect的 - TIMEOUT

import pexpect 
import time,sys, traceback, os 



telconn = pexpect.spawn('telnet 192.168.1.1') 
telconn.logfile = sys.stdout 

telconn.expect("Enter Choice>") 
telconn.send("tacl" + "\r") 

telconn.expect("TACL 1>") 
telconn.send("logon node.mgr" + "\r") 


telconn.expect("Password:") 
telconn.send("psw" + "\r") 

telconn.expect('$SYSTEM NODEMGR 1>') 
telconn.send("osh" + "\r") 

其实它正常工作,直到它检索旗帜(我不,如果它可能是问题)和旁边cli提示,在这里你可以看看输出:

python try.py 
Trying 192.168.1.1... 
Connected to 192.168.1.1. 
Escape character is '^]'. 




Available Services: 

TACL  EXIT  
taclr Choice> tacl 
logon node.mgrnode.mgr 
Password: psw 
Last Logon: 03 NOV 2015, 15:18 
Last Unsuccessful Attempt: 03 NOV 2015, 15:17 Total Failures: 24 
********************************************************************************November 3, 2015 15:51:57 
******************************************************************************** 
       This is a private system operated for XXX XXXXX 

      Authorization from XXX XXXXX management is required 
          for access to this system 

        Use by unauthorized persons is prohibited 


******************************************************************************** 
********************************************************************************(Invoking $SYSTEM.NODEMGR.TACLCSTM) 

Loaded from $SYSTEM.CBCLOCL.TACLMACS: 

FI FN V SV P F H DS CD LS CAT QUEUE FS PE SPE SP T SCPA SCPB SCPC SCPD 

Current volume is $SYSTEM.NODEMGR 


$SYSTEM NODEMGR 1> Traceback (most recent call last): 

    File "try.py", line 22, in <module> 
    telconn.expect('$SYSTEM NODEMGR 1>') 
    File "/usr/lib/python2.7/dist-packages/pexpect/__init__.py", line 1418, in expect 
    timeout, searchwindowsize) 
    File "/usr/lib/python2.7/dist-packages/pexpect/__init__.py", line 1433, in expect_list 
    timeout, searchwindowsize) 
    File "/usr/lib/python2.7/dist-packages/pexpect/__init__.py", line 1535, in expect_loop 
    raise TIMEOUT(str(err) + '\n' + str(self)) 
pexpect.TIMEOUT: Timeout exceeded. 
<pexpect.spawn object at 0xb7259acc> 
version: 3.1 
command: /usr/bin/telnet 
args: ['/usr/bin/telnet', '192.168.1.1'] 
searcher: <pexpect.searcher_re object at 0xb726f7ac> 
buffer (last 100 chars): 'T QUEUE FS PE SPE SP T SCPA SCPB SCPC SCPD\r\n\r\nCurrent volume is $SYSTEM.NODEMGR\r\n$SYSTEM NODEMGR 1> ' 
before (last 100 chars): 'T QUEUE FS PE SPE SP T SCPA SCPB SCPC SCPD\r\n\r\nCurrent volume is $SYSTEM.NODEMGR\r\n$SYSTEM NODEMGR 1> ' 
after: <class 'pexpect.TIMEOUT'> 
match: None 
match_index: None 
exitstatus: None 
flag_eof: False 
pid: 10135 
child_fd: 3 
closed: False 
timeout: 30 
delimiter: <class 'pexpect.EOF'> 
logfile: <open file '<stdout>', mode 'w' at 0xb753e078> 
logfile_read: None 
logfile_send: None 
maxread: 2000 
ignorecase: False 
searchwindowsize: None 
delaybeforesend: 0.05 
delayafterclose: 0.1 
delayafterterminate: 0.1 

正如你所看到的,最后提示我有是:

$SYSTEM NODEMGR 1> 

之后,我得到了:Traceback (most recent call last):

任何人都可以帮助我在修复这个问题? 我想继续检索一些输出,但我坚持在这一点!

回答

2

$炭在telconn.expect('$SYSTEM NODEMGR 1>')被解释为一个正则表达式元字符,其中,根据the doc

匹配行,其被定义为的 任一末端的字符串,或者任何的端部位置后跟一个换行符。

这将导致您的脚本无法匹配输入,其中包含字面值$ char,从而导致超时。

您有几种选择:

  • 逃脱正则表达式元字符,with care
  • 使用.expect_exact()代替.expect(),它使用普通字符串代替匹配编译的正则表达式的
  • 通过降低减少模式匹配(即使用telconn.expect('SYSTEM NODEMGR 1>')),如果剩余的字符串仍然足够大以便正确的脚本操作
+0

它的工作,非常感谢你,你可以帮我通过正则表达式匹配提示吗?我读过一些关于're'python的模块被导入的内容,但是我找不到有关命令等的其他内容。 – Loris91

+0

我在正则表达式中吮吸,尽量避免它。当我需要使用它时,我总是使用我指出的教程作为参考:https://docs.python.org/2/howto/regex.html# –

+0

@ Loris91:在适当的情况下,正则表达式非常有用。如果你知道正则表达式;你可能会发现自己每天都在使用它们(grep,search/replace)。我建议“掌握正则表达式”一书。 – jfs