Pexpect 无法在 Yes/No 提示符下工作
Pexpect not working at Yes/No prompt
我在 cisco 路由器上使用 pexpect 登录和 运行 命令。它卡在 RSA yes/no 提示符处,没有发送 "yes"。这是代码片段:
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 变量的各种版本,但都遇到同样的问题:
- 您确定要继续连接吗(yes/no)\?
- 您确定要继续连接(yes/no)吗?
- 您确定要继续连接吗
- (yes/no)?
- (yes/no)\?
- (yes/no)
这是通过 SSH 连接到交换机时的样子:
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
来避免这一点,因为您似乎不在乎根据任何解释做出决定。我不确定您的用例是否将列表中的空字符串匹配传递给 expect 调用,但是似乎无论索引如何,您都在发送密码并期待提示,就像初始身份验证和主机检查已完成一样。您收到的错误显示缓冲区包含 yes/no 提示,但在预期 >
时预期失败。有可能您的密码被发送到 yes no 提示,然后显示不包含 >
的 "Please type 'yes' or 'no':" 导致您超时。
您需要使用“(?i)yes/no”。我 运行 遇到了同样的问题。
我在 cisco 路由器上使用 pexpect 登录和 运行 命令。它卡在 RSA yes/no 提示符处,没有发送 "yes"。这是代码片段:
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 变量的各种版本,但都遇到同样的问题:
- 您确定要继续连接吗(yes/no)\?
- 您确定要继续连接(yes/no)吗?
- 您确定要继续连接吗
- (yes/no)?
- (yes/no)\?
- (yes/no)
这是通过 SSH 连接到交换机时的样子:
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
来避免这一点,因为您似乎不在乎根据任何解释做出决定。我不确定您的用例是否将列表中的空字符串匹配传递给 expect 调用,但是似乎无论索引如何,您都在发送密码并期待提示,就像初始身份验证和主机检查已完成一样。您收到的错误显示缓冲区包含 yes/no 提示,但在预期 >
时预期失败。有可能您的密码被发送到 yes no 提示,然后显示不包含 >
的 "Please type 'yes' or 'no':" 导致您超时。
您需要使用“(?i)yes/no”。我 运行 遇到了同样的问题。