Python pexpect没有在思科

时间:2018-04-06 18:30:12

标签: python cisco pexpect

尝试登录Cisco路由器。它没有在“--More--”提示符下发送正确的命令。我认为这可能与我发送的内容有关。我需要在收到更多提示时发送空格命令。

它会发送一个“\”字符,但会发送一个“”或任何随机字母。

当前代码:

import pexpect
import sys
import os
import getpass

hostname = "router-2"
username = raw_input('Enter Your username: ')
password = getpass.getpass('Password:')

fout = file('agglog.txt','w')

child = pexpect.spawn('ssh %s@%s' % (username, hostname))
child.logfile_read = fout
child.expect('Password:')
child.sendline(password)
child.expect('>')
child.sendline('enable')
child.expect('Password:')
child.sendline(password)
child.expect('#')
child.sendline('show processes cpu history')
i = child.expect(["--More--","#"])
if i==0:
    child.sendline(' ') ###PROBLEM IS HERE
else:
    child.sendline('show processes cpu | i Core 0|Core 1')
child.expect('#')
child.sendline('logout')

再次,在 --MORE--提示它只是在试图发送空间命令时正在等待某事。在Cisco路由器上,当您在该提示符下按空格键时,它会显示更多输出。由于权限,“终端长度0”在这种情况下不是一个选项。

非常感谢任何帮助。

编辑:

以下是输出结果:

router-2#show processes cpu history

History information for system:


    111112222222222111111111122222111111111122222111111111111111
    777770000000000999998888833333888889999900000999998888899999
100                                                             
 90                                                             
 80                                                             
 70                                                             
 60                                                             
 50                                                             
 40                                                             
 30                                                             
 20 ************************************************************
 10 ************************************************************
   0....5....1....1....2....2....3....3....4....4....5....5....
             0    5    0    5    0    5    0    5    0    5    
               CPU% per second (last 60 seconds)


    222222222222222222221222222222222222222222222222222222222222
    342000300104111121019410422602031010060202210143001042120601
 --More-- 

2 个答案:

答案 0 :(得分:0)

我假设pexpect在最后一行之前超时,因为它期待#,而不是它正在另一个 - 更多 - ?认为你需要使用while循环,这样的事情可能是:

while count < 10:
    output = child.readline()
    if '--More--' in output:
        child.sendline(' ')
    elif '#' in output:
        child.sendline('logout')
    count +=1
    time.sleep(1)

在每个循环之前睡一秒钟也很好,让终端有时间输出下一页。

希望得到这个帮助。

编辑:

嗯,这有点奇怪,期望和readline无法解析 - 更多 - 但它是在pexpect缓冲区,它看到它。我已经测试了这个,它起作用了我:

child.sendline('show processes cpu history')
count = 0
while count < 100:
output = child.readline().strip()
if '--More--' in child.buffer:  ### read buffer like so
    print output
    child.sendline(' ')
elif '#' in output:
    print 'done'
    child.sendline('logout')
    break
count +=1

如果您尝试打印child.buffer,您会注意到路由器终端发送了很多内容,因此您可能需要调整循环次数。

答案 1 :(得分:0)

对于偶然发现此线程的任何人,我过去通过首先发送命令来避免此问题:

terminal length 0

这会阻止设备对输出进行“分页”,以便您可以停止并阅读它。

该命令仅与您当前打开的会话相关,并在断开连接后消失。