执行CLI命令并使用telnetlib存储在变量中

时间:2013-07-22 07:26:18

标签: python router telnetlib

我使用Python telnetlib从路由器获取“运行配置”输出。如何在变量中存储“show running-config”输出。并打印变量。我的要求是每个输出都将显示在执行代码的每一行时的控制台。有任何选项可以避免这些打印语句。

import telnetlib
#import getpass
ipaddr = "10.1.1.1"
passwd = "abcd123"
tn = telnetlib.Telnet(ipaddr)
if Password:
    try:
          print (tn.write (password + "\n"))
          print(tn.read_until("Router>"))
          print(tn.write("enable\n"))
          print(tn.read_until("Password:"))
          print(tn.write(passwd + "\n"))
          print(tn.read_until("Router#"))
          print(tn.write("show clock\n"))
          print(tn.read_until("#"))
          print(tn.write("show running-config\n"))
          print(tn.write("\040\n"))
          print(tn.write("\040\n"))
          print(tn.write("\040\n"))
          print(tn.read_until("#"))
          print(tn.write("logout\n"))
          print(tn.read_until(">"))
          print tn.close

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望将在远程控制台上运行的每个命令的输出打印到本地控制台。我不确定为什么它需要同步,除非你说这是一个要求。您可能希望确保了解要求。在任何情况下,由于您的要求是打印输出,您不需要打印输入...

我强烈建议将输出存储到变量中,即使您需要立即打印它也只是因为我认为除非您要对数据进行操作而且只是打印数据而无法对数据进行操作,否则检索数据没有任何好处它。将其存储在变量中,然后可以打印并执行操作。我怀疑人眼是否能够分辨出存储它然后立刻写下它而不是零碎的。

您写的try块永远不会发生,因为您必须首先从telnet会话中读取,然后才能评估“Password:”是否在远程控制台上。

一些进一步的建议:

首先,写terminal length 0,这将避免必须处理暂停的输出。

其次,因为我很懒,所以我知道的任何变量我只是用来传递给远程单元我用换行符保存。

第三,总是给它一个超时,否则就有可能永远等待一场可能永远不会到来的比赛。

第四,看看Telnet.expect(list, [timeout])。我发现它比简单的read_until更有用;它允许您查找多个响应并相应地对每个响应进行操作。它对处理错误非常有用。它返回一个三项元组,表示匹配项的索引(如果不匹配则为-1)以及匹配的文本(如果不匹配,则返回缓冲区中的所有内容)。

第五,为你的telnet会话写一个装饰器来登录。你知道每次与远程单元交互时它至少会被使用一次,如果你正在加载新的固件,它会更多。开发一个可以重用的函数库,而不是每次都写出来。懒惰很好。

import telnetlib
import sys

ipaddr = "10.1.1.1"
passwd = "abcd123"


def login(tn):
  global passwd
  passwd=passwd+'\n'

  def error_check(tmp):
    if tmp[0]==-1: 
      print "Unexpected response"
      print "tmp[2]
      sys.exit()

  tmp=tn.expect(["Password:",], 5)
  error_check(tmp)
  tn.write(passwd)
  tmp=expect([">",],5)
  error_check(tmp)
  tn.write('en\n')
  tmp=expect(["Password", "#'],5)
  error_check(tmp)
  if tmp(0)==0:   #if someone left enable unlocked, don't send a password
    tn.write(passwd)        
  tmp=expect(["#',],5)
  error_check(tmp)         

tn = telnetlib.Telnet(ipaddr)
login(tn)
tn.write('terminal length 0')
tmp=expect(["#',],5)
tn.write('sho clock')
now=tn.expect(["#",], 5)
print now
tn.write('sho run')
print run
cfg=tn.expect(["#",], 5)
tn.write("logout\n"))
bye=tn.expect([">",], 5)
print bye
tn.close()