2017-05-16 57 views
0

感謝Python Library我能夠使用他們的示例遠程登錄到思科交換機,我將其用於學習目的,特別是學習python。Python Telnet腳本

然而,雖然所有的代碼似乎一般容易閱讀,我有點困惑,以下內容:

1 - 爲什麼使用下面 2- if語句爲什麼後使用「\ n」用戶名和密碼寫方法 3-爲什麼我不能讓我的bash終端上的輸出,當變化是逸岸承諾和成功

HOST = "172.16.1.76" 
user = raw_input("Enter your Telnet username : ") 
password = getpass.getpass() 

tn = telnetlib.Telnet(HOST) 

tn.read_until("Username: ") 
tn.write(user + '\n')    <----- 2 
if password:       <----- 1 
    tn.read_until("Password: ") 
    tn.write(password + "\n")  <------2 
tn.write("show run \n") 

time.sleep(5) 



output = tn.read_all()    <----- 3 
print output 

print "=" * 30 
print "Configuration Complete." 

我不知道,爲什麼使用上面的if語句,通常一旦你輸入用戶名,然後右鍵獲得密碼提示。爲什麼不能,我們只需要輸入:

tn.read_until("Username: ") 
tn.write(user + '\n') 
tn.read_until("Password: ") 
tn.write(password + "\n") 

至於第二點,爲什麼要使用的寫入方法的密碼和用戶名後的「\ n」,如果我們要按下回車鍵後,我們仍要添加呢?

回答

0

1:行

password = getpass.getpass() 

問你爲你的密碼,如果你離開它空,密碼將包含空字符串其中,在if語句,是一樣的假
腳本沒有按提前知道你的服務器上是否有密碼,它通過首先詢問你來模擬知道,如果你沒有輸入任何東西,它就會認爲它不會(否則它將永遠卡在tn.read_until("Password: ")上。)

2:'\n'模擬你點擊返回鍵,當你輸入y我們的密碼,例如'password<RETURN>'可變密碼將不包含一個尾隨換行符(\ n),這就是爲什麼它被手動所附

3:這一個我不知道,可能是5秒沒有足夠的時間來等待

+0

好的,我想我明白了。謝謝!所以bascialt「IF語句」是返回提示輸入密碼,如果你這樣做,它使它成真,然後在設備提示符中查找密碼字段,並輸入input'ted(這樣的詞?)密碼。正確?至於「\ n」,我仍然需要手動輸入,雖然我輸入用戶名和密碼後,我會盡管「\ n」會爲我照顧這個。 – tafiela

+0

注意腳本在telnet連接之前要求你輸入密碼。如果你只是按回車,密碼將是空的。當你用'if'命令行檢查密碼是否爲空時,如果密碼不爲空,那麼腳本會查看telnet輸出以查看密碼何時請求併發送。如果它是空的,腳本假定telnet不會要求輸入密碼。 – Nullman

0

執行後 tn = telnetlib.Telnet(HOST) 您已經從機器創建了一個telnet通道到HOST。但是您仍然需要與HOST進行通信以推送/發送您的命令並接收輸出。

要將您的命令推送到HOST,您需要執行tn.write(「your_commands_or_input \ n」),\ n表示換行符/返回值,這表示需要立即執行當前命令。執行完成後,HOST返回結果,這個結果會被你的telnet對象「tn」捕獲並保存在它的「本地緩存」中,你可以使用tn.read_until方法在預期的緩存中搜索任何關鍵字。已經找到了,read_until將會停止(總是在第一次找到的時候停止),並且你可以做任何你需要的事情(現在輪到你了),否則read_until會一直等待來自HOST的輸出(你還沒有轉過來)。最後,如果你想檢查所有輸出已被緩存,你可以執行tn.read_all()。

請記住一些使用不同登錄輸出的HOST,即用戶名和用戶名或密碼與密碼,最好使用正則表達式來匹配它們。

0

github上有一個python庫,專門用於telnet到cisco設備。

pip install git+https://github.com/sergeyzelyukin/cisco-telnet.git 

import ciscotelnet 
with ciscotelnet.CiscoTelnet(host, verbose = False) as cisco: 
    if cisco.login(final_mode=CiscoTelnet.MODE_ENABLE, user="john", user_pass="12345678", enable_pass="cisco"): 
    # if cisco.login(final_mode=CiscoTelnet.MODE_ENABLE, line_pass="abcdef", enable_pass="cisco"): 
    print cisco.cmd("sh int status | inc Fa0/1") 
    print cisco.conf(["interface fast0/1", "descr blank", "load-interval 300"]) 
    print cisco.wr()