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
模塊提供一個(gè)實(shí)現(xiàn)Telnet協(xié)議的類 Telnet
。關(guān)于此協(xié)議的細(xì)節(jié)請(qǐng)參見(jiàn) RFC 854 。此外,它還為協(xié)議字符(見(jiàn)下文)和 telnet 選項(xiàng)提供了對(duì)應(yīng)的符號(hào)常量。telnet選項(xiàng)對(duì)應(yīng)的符號(hào)名遵循 arpa/telnet.h
中的定義,但刪除了前綴 TELOPT_
。對(duì)于不在 arpa/telnet.h
的選項(xiàng)的符號(hào)常量名,請(qǐng)參考本模塊源碼。
telnet命令的符號(hào)常量名有: 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 服務(wù)器的連接. 實(shí)例初始化后默認(rèn)不連接;必須使用open()
方法來(lái)建立連接。或者, 可選參數(shù) host 和 port 也可以傳遞給構(gòu)造函數(shù),在這種情況下,到服務(wù)器的連接將在構(gòu)造函數(shù)返回前建立??蛇x參數(shù) timeout 為阻塞操作(如連接嘗試)指定一個(gè)以秒為單位的超時(shí)時(shí)間(如果沒(méi)有指定,將使用全局默認(rèn)設(shè)置) 。不要重新打開(kāi)一個(gè)已經(jīng)連接的實(shí)例。
這個(gè)類有很多
read_*()
方法。 請(qǐng)注意,其中一些方法在讀取結(jié)束時(shí)會(huì)觸發(fā)EOFError
異常,這是由于連接對(duì)象可能出于其它原因返回一個(gè)空字符串。 請(qǐng)參閱下面的個(gè)別描述。Telnet
對(duì)象一個(gè)上下文管理器,可以在with
語(yǔ)句中使用。當(dāng)with
塊結(jié)束,close()
方法會(huì)被調(diào)用:>>> from telnetlib import Telnet >>> with Telnet('localhost', 23) as tn: ... tn.interact() ...
在 3.6 版更改: 添加了上下文管理器的支持
參見(jiàn)
- RFC 854 - Telnet 協(xié)議規(guī)范
Telnet 協(xié)議的定義。
Telnet 對(duì)象?
Telnet
實(shí)例有以下幾種方法:
- Telnet.read_until(expected, timeout=None)?
讀取直到遇到給定字節(jié)串 expected 或 timeout 秒已經(jīng)過(guò)去。
當(dāng)沒(méi)有找到匹配時(shí),返回可用的內(nèi)容,也可能返回空字節(jié)。如果連接已關(guān)閉且沒(méi)有可用的熟數(shù)據(jù),將觸發(fā)
EOFError
。
- Telnet.read_all()?
讀取數(shù)據(jù),直到遇到 EOF;連接關(guān)閉前都會(huì)保持阻塞。
- Telnet.read_some()?
在達(dá)到 EOF 前,讀取至少一個(gè)字節(jié)的熟數(shù)據(jù)。如果命中 EOF,返回
b''
。如果沒(méi)有立即可用的數(shù)據(jù),則阻塞。
- Telnet.read_very_eager()?
在不阻塞 I/O 的情況下讀取所有的內(nèi)容(eager)。
如果連接已關(guān)閉并且沒(méi)有可用的熟數(shù)據(jù),將會(huì)觸發(fā)
EOFError
。如果沒(méi)有熟數(shù)據(jù)可用返回b''
。除非在一個(gè) IAC 序列的中間,否則不要進(jìn)行阻塞。
- Telnet.read_eager()?
讀取現(xiàn)成的數(shù)據(jù)。
如果連接已關(guān)閉并且沒(méi)有可用的熟數(shù)據(jù),將會(huì)觸發(fā)
EOFError
。如果沒(méi)有熟數(shù)據(jù)可用返回b''
。除非在一個(gè) IAC 序列的中間,否則不要進(jìn)行阻塞。
- Telnet.read_lazy()?
處理并返回已經(jīng)在隊(duì)列中的數(shù)據(jù)(lazy)。
如果連接已關(guān)閉并且沒(méi)有可用的數(shù)據(jù),將會(huì)觸發(fā)
EOFError
。如果沒(méi)有熟數(shù)據(jù)可用則返回b''
。除非在一個(gè) IAC 序列的中間,否則不要進(jìn)行阻塞。
- Telnet.read_very_lazy()?
返回熟數(shù)據(jù)隊(duì)列任何可用的數(shù)據(jù)(very lazy)。
如果連接已關(guān)閉并且沒(méi)有可用的數(shù)據(jù),將會(huì)觸發(fā)
EOFError
。如果沒(méi)有熟數(shù)據(jù)可用則返回b''
。該方法永遠(yuǎn)不會(huì)阻塞。
- Telnet.read_sb_data()?
返回在 SB/SE 對(duì)之間收集的數(shù)據(jù)(子選項(xiàng) begin/end)。當(dāng)使用
SE
命令調(diào)用回調(diào)函數(shù)時(shí),該回調(diào)函數(shù)應(yīng)該訪問(wèn)這些數(shù)據(jù)。該方法永遠(yuǎn)不會(huì)阻塞。
- Telnet.open(host, port=0[, timeout])?
連接主機(jī)。第二個(gè)可選參數(shù)是端口號(hào),默認(rèn)為標(biāo)準(zhǔn) Telnet 端口(23)??蛇x參數(shù) timeout 指定一個(gè)以秒為單位的超時(shí)時(shí)間用于像連接嘗試這樣的阻塞操作(如果沒(méi)有指定,將使用全局默認(rèn)超時(shí)設(shè)置)。
不要嘗試重新打開(kāi)一個(gè)已經(jīng)連接的實(shí)例。
觸發(fā) auditing event
telnetlib.Telnet.open
,參數(shù)為self
,host
,port
。
- Telnet.msg(msg, *args)?
當(dāng)調(diào)試級(jí)別
>
0 時(shí)打印一條調(diào)試信息。如果存在額外參數(shù),則它們會(huì)被替換在使用標(biāo)準(zhǔn)字符串格式化操作符的信息中。
- Telnet.set_debuglevel(debuglevel)?
設(shè)置調(diào)試級(jí)別。debuglevel 的值越高,得到的調(diào)試輸出越多(在
sys.stdout
)。
- Telnet.close()?
關(guān)閉連接對(duì)象。
- Telnet.get_socket()?
返回內(nèi)部使用的套接字對(duì)象。
- Telnet.fileno()?
返回內(nèi)部使用的套接字對(duì)象的文件描述符。
- Telnet.write(buffer)?
向套接字寫入一個(gè)字節(jié)字符串,將所有 IAC 字符加倍。如果連接被阻塞,這可能也會(huì)阻塞。如果連接關(guān)閉可能觸發(fā)
OSError
。觸發(fā) auditing event
telnetlib.Telnet.write
,參數(shù)為self
,buffer
。在 3.3 版更改: 曾經(jīng)該函數(shù)拋出
socket.error
,現(xiàn)在這是OSError
的別名。
- Telnet.interact()?
交互函數(shù),模擬一個(gè)非常笨拙的 Telnet 客戶端。
- Telnet.mt_interact()?
多線程版的
interact()
.
- Telnet.expect(list, timeout=None)?
一直讀取,直到匹配列表中的某個(gè)正則表達(dá)式。
第一個(gè)參數(shù)是一個(gè)正則表達(dá)式列表,可以是已編譯的 (正則表達(dá)式對(duì)象),也可以是未編譯的 (字節(jié)串)。 第二個(gè)可選參數(shù)是超時(shí),單位是秒;默認(rèn)一直阻塞。
返回一個(gè)包含三個(gè)元素的元組:列表中的第一個(gè)匹配的正則表達(dá)式的索引;返回的匹配對(duì)象;包括匹配在內(nèi)的讀取過(guò)的字節(jié)。
如果找到了文件的結(jié)尾且沒(méi)有字節(jié)被讀取,觸發(fā)
EOFError
。否則,當(dāng)沒(méi)有匹配時(shí),返回(-1, None, data)
,其中 data 是到目前為止接受到的字節(jié)(如果發(fā)生超時(shí),則可能是空字節(jié))。如果一個(gè)正則表達(dá)式以貪婪匹配結(jié)束(例如
.*
),或者多個(gè)表達(dá)式可以匹配同一個(gè)輸出,則結(jié)果是不確定的,可能取決于 I/O 計(jì)時(shí)。
- Telnet.set_option_negotiation_callback(callback)?
每次在輸入流上讀取 telnet 選項(xiàng)時(shí),這個(gè)帶有如下參數(shù)的 callback (如果設(shè)置了)會(huì)被調(diào)用: callback(telnet socket, command (DO/DONT/WILL/WONT), option)。telnetlib 之后不會(huì)再執(zhí)行其它操作。
Telnet 示例?
一個(gè)簡(jiǎn)單的說(shuō)明性典型用法例子:
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'))