0

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

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
4

1 回答 1

0

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

我强烈建议您将输出存储到一个变量中,即使您需要立即打印它,因为我认为检索数据没有任何好处,除非您要对数据采取行动,并且如果您只是打印数据,您将无法对其采取行动。将它存储在一个变量中,然后可以打印它并对其采取行动。我怀疑人眼能够分辨出存储它然后一次全部写入而不是零碎写入的区别。

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

一些进一步的建议:

首先, write 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()  
于 2013-08-20T01:45:23.843 回答