Python pexpect帮助 - 如果密码失败,则循环回循环



所以我对开发的新手是新手,因此我决定一种教学的好方法是创建一个小脚本,该脚本可以通过SSH配置Cisco Switchs/Rouyters。

有点卡在循环上。

基本上,用户已经使用用户名@ip_address进入了开关,现在他们需要输入密码。我需要的是,如果失败,则需要循环回到需要登录密码(因为很可能是因为输入了错误的密码)

x = 'false5'
while x != 'true5':
    switch_ssh_password = raw_input('What is the Login Password: ')
    #Commands to grant entry level access
    child.expect('password:')
    child.sendline(switch_ssh_password)
    if child.expect('%>'):
            print "1 - Entry to Switch was Granted"
            x = 'true5'
    else:
            print "1 - Entry to Switch was Denied, Try Again"
            x = 'false5'

现在,当我获得此用户输入时,我输入密码,悬挂大约30秒,然后再回来,我不知道怎么了:(

Traceback (most recent call last):
  File "./configcisco.py", line 68, in <module>
    if child.expect('%>'):
  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 0x76a87f70>
version: 3.2
command: /usr/bin/ssh
args: ['/usr/bin/ssh', 'administrator@172.16.1.1']
searcher: <pexpect.searcher_re object at 0x76a9ec50>
buffer (last 100 chars): ' rnrnryan-sw01>'
before (last 100 chars): ' rnrnryan-sw01>'
after: <class 'pexpect.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 11917
child_fd: 3
closed: False
timeout: 30
delimiter: <class 'pexpect.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1

没有所有代码,很难确切地弄清楚发生了什么。但是,根据您发布的时机查找外壳字符的时间,对于其他一些诊断,我会稍微更改您的代码:

while True:
    switch_ssh_password = raw_input('What is the Login Password: ')
    #Commands to grant entry level access
    child.expect('password:')
    child.sendline(switch_ssh_password)
    if child.expect('%>'):
        print "1 - Entry to Switch was Granted"
        break
    elif child.expect('Permission denied'):
        print "Password Error or some message..."
    else:
        print "1 - Entry to Switch was Denied, Try Again"

所以我像我自己一样重写了您的代码,(并且还将您的一些东西留在那里)进行了测试并确保它可以正常工作,您可以在这里看到它:

pastebin代码

我的编码样式是许多不同语言和样式之间的混合,因此不要过多地专注于。但是,请看看我如何处理IP地址。在此过程中,我确实发现了一些错误:

1)期望功能可以捕获超时,而不是提高异常。这是一个更好的编程实践。当您执行此操作时,它将返回所找到项目列表中的索引(在这种情况下为0)。您应该花一些时间阅读Pexpect的完整文档,使用搜索功能它有助于很多,这些模块通常非常强大且功能满足,因此您可能会错过所需的真实功能并重新发明轮子可以这么说。

2)如果您查看错误,则可以看到:

缓冲区(最后100个字符):' r n r nryan-sw01>'

因此,它确实成功地连接到了主机nryan-sw01,并且您正在提示,但是您正在寻找'%>',而不是只是'>'>'

最新更新