2015-11-03 3 views
1

Я просто пытался создать скрипт, чтобы получить некоторые выходы из устройства в Unix-основе, здесь вы можете найти свой код:Python PEXPECT - АУТ

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:

совпадений в конце строки, которая определяется либо как конец строки, или какой-либо а затем символ новой строки.

Это приводит к тому, что ваш скрипт терпит неудачу, соответствующий вводу, который содержит символ $, что приводит к таймауту.

У вас есть несколько вариантов:

  • ускользает регулярные выражения метасимволов, 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

Смежные вопросы