所以我对开发很陌生,所以我决定通过创建一个通过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
答案 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)
所以我重写了你的代码,好像我自己做的那样(并且还留下了你的一些东西)测试了它并确保它正常工作,你可以在这里看到它:
我的编码风格是很多不同语言和风格的混合,所以不要过于专注。但是,看看我如何处理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;'