【问题标题】:Execute a CLI command and store in a variable using telnetlib使用 telnetlib 执行 CLI 命令并存储在变量中
【发布时间】:2013-07-20 20:41:08
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您不一定需要打印每个操作;您可以将它们存储在变量、对象或字典之类的东西中,然后再执行打印操作。不过,从外观上看,它似乎非常具有事务性,因此可能无法变得更加优雅。如果你能提供一个输出样本,那是可能的。

标签: python router telnetlib


【解决方案1】:

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

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

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

一些进一步的建议:

首先,写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()  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-12
    • 2017-11-28
    • 1970-01-01
    • 2021-05-14
    • 2023-03-26
    相关资源
    最近更新 更多