telnetlib -- Telnet 客戶端?
源代碼: Lib/telnetlib.py
Deprecated since version 3.11, will be removed in version 3.13: The telnetlib module is deprecated
(see PEP 594 for details and alternatives).
telnetlib 模塊提供一個實現Telnet協議的類 Telnet。關于此協議的細節(jié)請參見 RFC 854 。此外,它還為協議字符(見下文)和 telnet 選項提供了對應的符號常量。telnet選項對應的符號名遵循 arpa/telnet.h 中的定義,但刪除了前綴 TELOPT_。對于不在 arpa/telnet.h 的選項的符號常量名,請參考本模塊源碼。
telnet命令的符號常量名有: IAC, DONT, DO, WONT, WILL, SE (Subnegotiation End), NOP (No Operation), DM (Data Mark), BRK (Break), IP (Interrupt process), AO (Abort output), AYT (Are You There), EC (Erase Character), EL (Erase Line), GA (Go Ahead), SB (Subnegotiation Begin).
- class telnetlib.Telnet(host=None, port=0[, timeout])?
Telnet表示到 Telnet 服務器的連接. 實例初始化后默認不連接;必須使用open()方法來建立連接。或者, 可選參數 host 和 port 也可以傳遞給構造函數,在這種情況下,到服務器的連接將在構造函數返回前建立??蛇x參數 timeout 為阻塞操作(如連接嘗試)指定一個以秒為單位的超時時間(如果沒有指定,將使用全局默認設置) 。不要重新打開一個已經連接的實例。
這個類有很多
read_*()方法。 請注意,其中一些方法在讀取結束時會觸發(fā)EOFError異常,這是由于連接對象可能出于其它原因返回一個空字符串。 請參閱下面的個別描述。Telnet對象一個上下文管理器,可以在with語句中使用。當with塊結束,close()方法會被調用:>>> from telnetlib import Telnet >>> with Telnet('localhost', 23) as tn: ... tn.interact() ...
在 3.6 版更改: 添加了上下文管理器的支持
參見
- RFC 854 - Telnet 協議規(guī)范
Telnet 協議的定義。
Telnet 對象?
Telnet 實例有以下幾種方法:
- Telnet.read_until(expected, timeout=None)?
讀取直到遇到給定字節(jié)串 expected 或 timeout 秒已經過去。
當沒有找到匹配時,返回可用的內容,也可能返回空字節(jié)。如果連接已關閉且沒有可用的熟數據,將觸發(fā)
EOFError。
- Telnet.read_all()?
讀取數據,直到遇到 EOF;連接關閉前都會保持阻塞。
- Telnet.read_some()?
在達到 EOF 前,讀取至少一個字節(jié)的熟數據。如果命中 EOF,返回
b''。如果沒有立即可用的數據,則阻塞。
- Telnet.read_very_eager()?
在不阻塞 I/O 的情況下讀取所有的內容(eager)。
如果連接已關閉并且沒有可用的熟數據,將會觸發(fā)
EOFError。如果沒有熟數據可用返回b''。除非在一個 IAC 序列的中間,否則不要進行阻塞。
- Telnet.read_eager()?
讀取現成的數據。
如果連接已關閉并且沒有可用的熟數據,將會觸發(fā)
EOFError。如果沒有熟數據可用返回b''。除非在一個 IAC 序列的中間,否則不要進行阻塞。
- Telnet.read_lazy()?
處理并返回已經在隊列中的數據(lazy)。
如果連接已關閉并且沒有可用的數據,將會觸發(fā)
EOFError。如果沒有熟數據可用則返回b''。除非在一個 IAC 序列的中間,否則不要進行阻塞。
- Telnet.read_very_lazy()?
返回熟數據隊列任何可用的數據(very lazy)。
如果連接已關閉并且沒有可用的數據,將會觸發(fā)
EOFError。如果沒有熟數據可用則返回b''。該方法永遠不會阻塞。
- Telnet.read_sb_data()?
返回在 SB/SE 對之間收集的數據(子選項 begin/end)。當使用
SE命令調用回調函數時,該回調函數應該訪問這些數據。該方法永遠不會阻塞。
- Telnet.open(host, port=0[, timeout])?
連接主機。第二個可選參數是端口號,默認為標準 Telnet 端口(23)??蛇x參數 timeout 指定一個以秒為單位的超時時間用于像連接嘗試這樣的阻塞操作(如果沒有指定,將使用全局默認超時設置)。
不要嘗試重新打開一個已經連接的實例。
觸發(fā) auditing event
telnetlib.Telnet.open,參數為self,host,port。
- Telnet.msg(msg, *args)?
當調試級別
>0 時打印一條調試信息。如果存在額外參數,則它們會被替換在使用標準字符串格式化操作符的信息中。
- Telnet.set_debuglevel(debuglevel)?
設置調試級別。debuglevel 的值越高,得到的調試輸出越多(在
sys.stdout)。
- Telnet.close()?
關閉連接對象。
- Telnet.get_socket()?
返回內部使用的套接字對象。
- Telnet.fileno()?
返回內部使用的套接字對象的文件描述符。
- Telnet.write(buffer)?
向套接字寫入一個字節(jié)字符串,將所有 IAC 字符加倍。如果連接被阻塞,這可能也會阻塞。如果連接關閉可能觸發(fā)
OSError。觸發(fā) auditing event
telnetlib.Telnet.write,參數為self,buffer。在 3.3 版更改: 曾經該函數拋出
socket.error,現在這是OSError的別名。
- Telnet.interact()?
交互函數,模擬一個非常笨拙的 Telnet 客戶端。
- Telnet.mt_interact()?
多線程版的
interact().
- Telnet.expect(list, timeout=None)?
一直讀取,直到匹配列表中的某個正則表達式。
第一個參數是一個正則表達式列表,可以是已編譯的 (正則表達式對象),也可以是未編譯的 (字節(jié)串)。 第二個可選參數是超時,單位是秒;默認一直阻塞。
返回一個包含三個元素的元組:列表中的第一個匹配的正則表達式的索引;返回的匹配對象;包括匹配在內的讀取過的字節(jié)。
如果找到了文件的結尾且沒有字節(jié)被讀取,觸發(fā)
EOFError。否則,當沒有匹配時,返回(-1, None, data),其中 data 是到目前為止接受到的字節(jié)(如果發(fā)生超時,則可能是空字節(jié))。如果一個正則表達式以貪婪匹配結束(例如
.*),或者多個表達式可以匹配同一個輸出,則結果是不確定的,可能取決于 I/O 計時。
- Telnet.set_option_negotiation_callback(callback)?
每次在輸入流上讀取 telnet 選項時,這個帶有如下參數的 callback (如果設置了)會被調用: callback(telnet socket, command (DO/DONT/WILL/WONT), option)。telnetlib 之后不會再執(zhí)行其它操作。
Telnet 示例?
一個簡單的說明性典型用法例子:
import getpass
import telnetlib
HOST = "localhost"
user = input("Enter your remote account: ")
password = getpass.getpass()
tn = telnetlib.Telnet(HOST)
tn.read_until(b"login: ")
tn.write(user.encode('ascii') + b"\n")
if password:
tn.read_until(b"Password: ")
tn.write(password.encode('ascii') + b"\n")
tn.write(b"ls\n")
tn.write(b"exit\n")
print(tn.read_all().decode('ascii'))