Python Script Telnet到Cisco Router ...然后阻止?

时间:2017-05-23 01:31:27

标签: python telnet cisco

我努力编写一个Python脚本,可以登录我们的Cisco路由器并收集简单命令的输出。挑战在于并非所有路由器都以相同的方式配置。当你telnet到其中一些人时,你会遇到一个用户名&密码;其他路由器只挑战您的密码。我的脚本必须足够智能,以区分它。

我已经编写了以下代码,该代码非常智能,可以实现路由器是否需要用户名。麻烦的是,它似乎在 成功登录后阻止 。(它适用于用户名/密码和仅限密码的路由器。)我花了一天时间与摔跤这段代码,我认为代码会在我发送简单的Cisco命令后尝试读取时阻塞。 (但也有可能是" show ip int brief" commmand没有被发送。)

以下是代码:

#!/usr/bin/python

import telnetlib
import sys


def telnetLogin( host ):
  username = "userguy"                     # Correct username
  password = "password1"                   # Correct password

  flag = 1
  tn = telnetlib.Telnet(host)
  while(flag):
    output = tn.read_some()                # get one line
    if("username:" in output.lower()):     # We are prompted for "Username:"
      tn.write(username+"\n")
    elif("password:" in output.lower()):   # We are prompted for "Password:"
      tn.write(password+"\n")
      flag = 0

  print("======================================================")  # Code reaches here

  tn.write("show ip int brief"+"\n")      # Issue simple Cisco cmd here
  output = tn.read_all()                  # I am blocking here???
  #output = tn.read_until(">", 2)         # This doesn't work either
  print "output ::  "+output              # I never reach this line
  tn.close()

def main():
  host = sys.argv[1]
  output=telnetLogin( host )

if __name__ == "__main__":
  main()
  print("Program done!\n")

这是输出:

[Linux]$ ./telnetToRouter.py RouterA
======================================================
...program blocks here...

我无法弄清楚为什么我能够成功读/写足够登录,但之后无法进行任何读/写操作。你怎么解决这样的事情?

谢谢, -RAO

1 个答案:

答案 0 :(得分:0)

我在查看路由器日志时偶然发现了答案。事实证明这里的问题是思科的事情,而不是Python的事情。解释:

当人类管理员telnet到Cisco路由器并发出长输出命令时,路由器会像这样分解输出:

Router-A#
Router-A# show ip int brief
Interface              IP-Address      OK? Method Status                Protocol
GigabitEthernet0/0     10.10.10.100    YES NVRAM  up                    up
GigabitEthernet0/1     10.10.20.100    YES NVRAM  up                    up
GigabitEthernet0/2     10.10.30.100    YES NVRAM  up                    up
GigabitEthernet0/3     10.10.40.100    YES NVRAM  up                    up
 --More--

那" --More--"是人类管理员点击空格键以获得更多输出的信号。所以实际上,我的Python脚本并没有阻止 - 因为它没有理解"更多"语法。

解决方案是让脚本发出" term len 0"登录路由器后,命令 立即 。这个命令是Ciscoese for" 在一个大块中打印所有输出。"一旦我的脚本执行了此操作,就可以与路由器进行交互,没问题。