一、Telnet概述
Telnet是一種遠程管理協議,最初是為了在早期計算機系統之間建立連接和進行遠程終端會話而創建的。它允許用戶在本地計算機上打開終端窗口,並通過網絡連接到遠程計算機。在連接到遠程計算機之後,用戶可以執行操作並與遠程計算機進行交互,就像他們在本地計算機上一樣。
Python實現Telnet功能,可以通過Python內置的telnetlib模塊輕鬆地建立Telnet連接並控制遠程設備。
二、Python Telnet實現連接遠程設備
在Python中,使用telnetlib模塊可以建立Telnet連接並控制遠程設備。
import telnetlib # 連接Telnet服務器 tn = telnetlib.Telnet("192.168.1.1", port=23, timeout=10) # 登錄 tn.read_until(b"login: ") tn.write(b"username\n") tn.read_until(b"Password: ") tn.write(b"password\n") # 開始控制 tn.write(b"command\n") tn.write(b"exit\n")
在上面的示例中,使用Telnet庫建立了一個Telnet連接。連接遠程設備的IP地址是192.168.1.1,端口號是23,超時時間是10秒。
隨後,登錄到遠程設備,對於登錄設備,我們需要在讀取到登陸提示文字後輸入用戶名和密碼,使用read_until方法等待讀取輸入模板字符串,使用write方法通過Telnet連接向設備發送指定的命令,最後從會話中退出,關閉與設備的連接,也就是輸入exit命令。
三、Telnet連接其他設置
除了上述步驟外,還可以通過Telnet連接進行其他設置,例如:
1. 設置調試模式(debuglevel)
import telnetlib tn = telnetlib.Telnet("192.168.1.1", port=23, timeout=10) tn.set_debuglevel(1) # ...
這段代碼告訴Python在建立Telnet連接時啟用調試模式,並將「1」設置為調試級別。
2. 設置Telnet連接的參數(set_option)
import telnetlib tn = telnetlib.Telnet("192.168.1.1", port=23, timeout=10) # 設置登錄成功後提示符 tn.set_option_negotiation_callback(lambda op: tn.write(b"prompt\n") if op == telnetlib.Telnet.DO and tn.iacseq[-2:] == b"\xff\xfd" else None) # ...
在上面的代碼段中,我們使用set_option_negotiation_callback方法為Telnet連接記錄回調函數。當Telnet連接遇到「DO」操作碼,且最後兩個SEND請求是「FF」和「FD」(表示登錄成功),則該函數發送「prompt」字符串到遠程設備。
3. Telnet命令行參數(command)
import telnetlib tn = telnetlib.Telnet("192.168.1.1", port=23, timeout=10) # 進入exec命令行模式 tn.write(b"enable\n") tn.write(b"config t\n") res = tn.write(b"command\n") # ...
在上述代碼段中,我們通過exec模式繪製了一個新的Telnet命令行,並在其中使用多個Telnet命令。通過write方法執行command命令,可以實現想要的動作。
四、完整代碼示例
下面是一個完整的Python程序示例,使用telnetlib模塊建立Telnet連接並控制遠程設備。
import telnetlib TELNET_PORT = 23 TELNET_TIMEOUT = 5 def tn_login(tn, user, password): tn.read_until(b"login: ") tn.write(user.encode('ascii') + b"\n") tn.read_until(b"Password: ") tn.write(password.encode('ascii') + b"\n") def tn_cmd(tn, cmd): tn.write(cmd.encode('ascii') + b"\n") return tn.read_all().decode('ascii') def main(): with telnetlib.Telnet("192.168.1.1", TELNET_PORT, TELNET_TIMEOUT) as tn: tn_login(tn, "username", "password") output = tn_cmd(tn, "ls -l") print(output) if __name__ == "__main__": main()
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/310111.html