我努力编写一个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
答案 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" 在一个大块中打印所有输出。"一旦我的脚本执行了此操作,就可以与路由器进行交互,没问题。