0

ルーターから「running config」出力を取得するために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
4

1 に答える 1

0

あなたが正しく理解している場合は、リモート コンソールで実行した各コマンドの出力をローカル コンソールに出力したいと考えています。あなたがそれが要件であると言う以外は、なぜ同期する必要があるのか​​ わかりません。要件を理解していることを確認する必要がある場合があります。いずれにせよ、あなたの要件は出力を印刷することなので、入力を印刷する必要はありません...

すぐに出力する必要がある場合でも、出力を変数に格納することを強くお勧めします。データに基づいて操作する場合を除き、データを取得する利点はなく、単にデータを出力するだけでは操作できないためです。それを変数に格納すると、印刷したり、処理したりできます。人間の目は、それを保存してから、少しずつではなく一度にすべてを書き込むことの違いを見分けることができるとは思えません.

'Password:' がリモート コンソール上にあるかどうかを評価する前に、最初に telnet セッションから読み取る必要があるため、書かれているように、try ブロックは発生しません。

さらにいくつかの提案:

まず、terminal length 0一時停止した出力を処理する必要がないように を記述します。

第二に、私は怠け者なので、リモートユニットに渡すためだけに使用していることがわかっている変数は、改行文字で保存します。

第三に、常にタイムアウトを与えてください。

4番目に、 を見てください Telnet.expect(list, [timeout])。単純な read_until よりもはるかに便利だと思います。複数の応答を探し、それに応じてそれぞれに対応することができます。エラーを処理するのに非常に便利です。一致した項目のインデックス (一致しない場合は -1) と一致したテキスト (または一致しない場合はバッファー内のすべて) を表す 3 つの項目のタプルを返します。

第 5 に、ログインするための telnet セッション用のデコレータを作成します。リモート ユニットと対話するたびに少なくとも 1 回は使用され、新しいファームウェアをロードする場合はさらに使用されることがわかっています。毎回書き出すのではなく、再利用できる関数のライブラリを開発します。怠け者は良いです。

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 に答える