簡體   English   中英

Pexpect在“是/否”提示下不起作用

[英]Pexpect not working at Yes/No prompt

我正在使用pexpect在Cisco路由器上登錄並運行命令。 它卡在RSA是/否提示下,並且不發送“是”。 這是代碼片段:

fout = file(filepath,'w')
child = pexpect.spawn('ssh %s@%s' % (username, agg))
child.logfile_read = fout
rsa_key = '\(yes\/no\)\?' 
prompt = "Password:"
i = child.expect([rsa_key,prompt,""])
if i==0:
    child.sendline('yes')
    child.expect(prompt)
    child.sendline(password)
elif i==1:
    child.sendline(password)
else:       
    child.sendline(password)

child.expect('>')
child.sendline('enable')
child.expect('Password:')
child.sendline(password)
child.expect('#')
child.sendline('terminal length 0')
child.expect('#')
child.sendline('show processes cpu history')
child.expect('#')
child.sendline('logout')

這是我得到的錯誤:

Traceback (most recent call last):
  File "/usr/pre_check.py", line 378, in <module>
    agg_check = agg_checks(agg,username,password)
  File "/usr/pre_check.py", line 198, in agg_checks
    child.expect('>')
  File "/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py", line 327, in expect
    timeout, searchwindowsize, async_)
  File "/usr/local/lib/python2.7/dist-packages/pexpect/spawnbase.py", line 355, in expect_list
    return exp.expect_loop(timeout)
  File "/usr/local/lib/python2.7/dist-packages/pexpect/expect.py", line 104, in expect_loop
    return self.timeout(e)
  File "/usr/local/lib/python2.7/dist-packages/pexpect/expect.py", line 68, in timeout
    raise TIMEOUT(msg)
pexpect.exceptions.TIMEOUT: Timeout exceeded.
<pexpect.pty_spawn.spawn object at 0x7f6c5e4b89d0>
command: /usr/bin/ssh
args: ['/usr/bin/ssh', 'username@router']
buffer (last 100 chars): 'TyefPiveH4nHv1dfvbL/MFbqSR+dup1U7Cn+JaDeq0.\r\nAre you sure you want to continue connecting (yes/no)? '
before (last 100 chars): 'TyefPiveH4nHv1dfvbL/MFbqSR+dup1U7Cn+JaDeq0.\r\nAre you sure you want to continue connecting (yes/no)? '
after: <class 'pexpect.exceptions.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 28991
child_fd: 7
closed: False
timeout: 30
delimiter: <class 'pexpect.exceptions.EOF'>
logfile: None
logfile_read: <open file 'mylogfile.txt', mode 'w' at 0x7f6c5e53ee40>
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
searcher: searcher_re:
    0: re.compile(">")

我已經嘗試過rsa_key變量的varius版本,並且存在相同的問題:

  • 您確定要繼續連接(是/否)\\嗎?
  • 您確定要繼續連接(是/否)嗎?
  • 您確定要繼續連接嗎
  • (是/否)?
  • (是/否)\\?
  • (是/否)

這是在切換到交換機時的樣子:

ssh username@routername
The authenticity of host 'routername (11.111.111.1)' can't be established.
RSA key fingerprint is SHA256:KCS1HKzltOwHgg+WhTsV3OTxNzxUQwN9T3Jp1lGVu00.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'routername,11.111.111.1' (RSA) to the list of known hosts.
Password: 

routername>

就個人而言,我會用ssh -o StrictHostKeyChecking=no來回避整個問題,因為似乎您不在乎根據任何解釋做出決定。 我不確定要傳遞給列表的空字符串匹配的用例以進行調用,但是似乎無論索引如何,您都在發送密碼並期望出現提示,就像初始身份驗證和主機檢查已完成一樣。 您收到的錯誤將緩沖區顯示為包含是/否提示,但在期望>同時期望失敗。 您的密碼可能會發送到“是”,“否”提示,然后顯示不包含“ > ”的“請輸入'是'或'否':”,這會使您超時。

您需要使用“(?i)是/否”。 我遇到了同樣的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM