2013-07-22 27 views
0

我使用Python telnetlib採取從router.How的「運行配置」輸出到存儲在variable.And「顯示運行配置」輸出打印變量的變量執行CLI命令和存儲。我的要求是在執行代碼的每一行時,每個輸出都將顯示在控制檯中。是否有任何選項可以避免這些打印語句。使用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 
+0

你不一定需要打印每一個操作;您可以將它們存儲在變量,對象或字典等內容中,然後再執行打印操作。儘管如此,它看起來非常具有事務性,所以它可能無法變得更加優雅。如果你可以提供一個輸出樣本,這可能是可能的。 – dilbert

回答

0

如果我理解正確,您希望將您在遠程控制檯上運行的每個命令的輸出打印到本地控制檯。我不確定爲什麼它需要同步,除非你說這是一個需求。您可能想確保您瞭解要求。在任何情況下,由於您的要求是輸出打印,您不需要打印輸入...

我強烈建議存儲輸出到一個變量,即使你需要立即打印出來,只是因爲我除非您要對數據採取行動,並且僅打印數據,否則無法採取行動,否則不會檢索數據。將其存儲在一個變量中,然後可以打印並執行操作。我懷疑人類的眼睛能夠分辨存儲它,然後立刻寫入,而不是零碎。

你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()