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

时间:2016-12-29 15:35:12

标签: python pexpect

所以我对开发很陌生,所以我决定通过创建一个通过SSH配置思科交换机/路由器的小脚本来教我自己。 虽然有点卡在一个循环上。

基本上用户已经使用用户名@ ip_address通过SSH进入交换机,现在需要输入密码。 我需要的是,如果它失败,则需要使用登录密码(因为输入了错误的密码很可能是因为它)

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): ' \r\n\r\nryan-sw01>'
before (last 100 chars): ' \r\n\r\nryan-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

2 个答案:

答案 0 :(得分:0)

如果没有所有代码,很难弄清楚到底发生了什么。但是根据你发布的Timing出来寻找shell字符的内容,对于一些额外的诊断我会改变你的代码:

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"

答案 1 :(得分:0)

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

Pastebin code

我的编码风格是很多不同语言和风格的混合,所以不要过于专注。但是,看看我如何处理IP地址。在这个过程中,我确实发现了一些错误:

1)expect函数可以捕获TIMEOUT,而不是引发异常。这是一个更好的编程实践。执行此操作时,它将返回找到的项目列表中的索引(在本例中为0)。您应该花一些时间阅读pexpect的完整文档,使用它有帮助的搜索功能,这些模块通常非常强大且功能齐全,因此您可能会错过所需的真正功能 - 可以说,用你自己的代码来发明轮子。

2)如果你看错了,你可以看到:

  

缓冲区(最后100个字符):'\ r \ n \ r \ n \ n \ n \ n \ n \ n \ n \ n \ n \ n?

所以它DID成功连接到主机nryan-sw01,而你正处于提示状态,但你正在寻找'%&gt;',而不仅仅是'&gt;'