2015-11-03 52 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