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é)請參見 RFC 854 。此外,它還為協(xié)議字符(見下文)和 telnet 選項(xiàng)提供了對應(yīng)的符號常量。telnet選項(xiàng)對應(yīng)的符號名遵循 arpa/telnet.h 中的定義,但刪除了前綴 TELOPT_。對于不在 arpa/telnet.h 的選項(xiàng)的符號常量名,請參考本模塊源碼。

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 服務(wù)器的連接. 實(shí)例初始化后默認(rèn)不連接;必須使用 open() 方法來建立連接?;蛘?, 可選參數(shù) host 和 port 也可以傳遞給構(gòu)造函數(shù),在這種情況下,到服務(wù)器的連接將在構(gòu)造函數(shù)返回前建立。可選參數(shù) timeout 為阻塞操作(如連接嘗試)指定一個(gè)以秒為單位的超時(shí)時(shí)間(如果沒有指定,將使用全局默認(rèn)設(shè)置) 。

不要重新打開一個(gè)已經(jīng)連接的實(shí)例。

這個(gè)類有很多 read_*() 方法。 請注意,其中一些方法在讀取結(jié)束時(shí)會觸發(fā) EOFError 異常,這是由于連接對象可能出于其它原因返回一個(gè)空字符串。 請參閱下面的個(gè)別描述。

Telnet 對象一個(gè)上下文管理器,可以在 with 語句中使用。當(dāng) with 塊結(jié)束,close() 方法會被調(diào)用:

>>>
>>> from telnetlib import Telnet
>>> with Telnet('localhost', 23) as tn:
...     tn.interact()
...

在 3.6 版更改: 添加了上下文管理器的支持

參見

RFC 854 - Telnet 協(xié)議規(guī)范

Telnet 協(xié)議的定義。

Telnet 對象?

Telnet 實(shí)例有以下幾種方法:

Telnet.read_until(expected, timeout=None)?

讀取直到遇到給定字節(jié)串 expectedtimeout 秒已經(jīng)過去。

當(dāng)沒有找到匹配時(shí),返回可用的內(nèi)容,也可能返回空字節(jié)。如果連接已關(guān)閉且沒有可用的熟數(shù)據(jù),將觸發(fā) EOFError

Telnet.read_all()?

讀取數(shù)據(jù),直到遇到 EOF;連接關(guān)閉前都會保持阻塞。

Telnet.read_some()?

在達(dá)到 EOF 前,讀取至少一個(gè)字節(jié)的熟數(shù)據(jù)。如果命中 EOF,返回 b''。如果沒有立即可用的數(shù)據(jù),則阻塞。

Telnet.read_very_eager()?

在不阻塞 I/O 的情況下讀取所有的內(nèi)容(eager)。

如果連接已關(guān)閉并且沒有可用的熟數(shù)據(jù),將會觸發(fā) EOFError 。如果沒有熟數(shù)據(jù)可用返回 b'' 。除非在一個(gè) IAC 序列的中間,否則不要進(jìn)行阻塞。

Telnet.read_eager()?

讀取現(xiàn)成的數(shù)據(jù)。

如果連接已關(guān)閉并且沒有可用的熟數(shù)據(jù),將會觸發(fā) EOFError 。如果沒有熟數(shù)據(jù)可用返回 b'' 。除非在一個(gè) IAC 序列的中間,否則不要進(jìn)行阻塞。

Telnet.read_lazy()?

處理并返回已經(jīng)在隊(duì)列中的數(shù)據(jù)(lazy)。

如果連接已關(guān)閉并且沒有可用的數(shù)據(jù),將會觸發(fā) EOFError 。如果沒有熟數(shù)據(jù)可用則返回 b'' 。除非在一個(gè) IAC 序列的中間,否則不要進(jìn)行阻塞。

Telnet.read_very_lazy()?

返回熟數(shù)據(jù)隊(duì)列任何可用的數(shù)據(jù)(very lazy)。

如果連接已關(guān)閉并且沒有可用的數(shù)據(jù),將會觸發(fā) EOFError 。如果沒有熟數(shù)據(jù)可用則返回 b'' 。該方法永遠(yuǎn)不會阻塞。

Telnet.read_sb_data()?

返回在 SB/SE 對之間收集的數(shù)據(jù)(子選項(xiàng) begin/end)。當(dāng)使用 SE 命令調(diào)用回調(diào)函數(shù)時(shí),該回調(diào)函數(shù)應(yīng)該訪問這些數(shù)據(jù)。該方法永遠(yuǎn)不會阻塞。

Telnet.open(host, port=0[, timeout])?

連接主機(jī)。第二個(gè)可選參數(shù)是端口號,默認(rèn)為標(biāo)準(zhǔn) Telnet 端口(23)??蛇x參數(shù) timeout 指定一個(gè)以秒為單位的超時(shí)時(shí)間用于像連接嘗試這樣的阻塞操作(如果沒有指定,將使用全局默認(rèn)超時(shí)設(shè)置)。

不要嘗試重新打開一個(gè)已經(jīng)連接的實(shí)例。

觸發(fā) auditing event telnetlib.Telnet.open ,參數(shù)為 self,host,port

Telnet.msg(msg, *args)?

當(dāng)調(diào)試級別 > 0 時(shí)打印一條調(diào)試信息。如果存在額外參數(shù),則它們會被替換在使用標(biāo)準(zhǔn)字符串格式化操作符的信息中。

Telnet.set_debuglevel(debuglevel)?

設(shè)置調(diào)試級別。debuglevel 的值越高,得到的調(diào)試輸出越多(在 sys.stdout )。

Telnet.close()?

關(guān)閉連接對象。

Telnet.get_socket()?

返回內(nèi)部使用的套接字對象。

Telnet.fileno()?

返回內(nèi)部使用的套接字對象的文件描述符。

Telnet.write(buffer)?

向套接字寫入一個(gè)字節(jié)字符串,將所有 IAC 字符加倍。如果連接被阻塞,這可能也會阻塞。如果連接關(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á)式對象),也可以是未編譯的 (字節(jié)串)。 第二個(gè)可選參數(shù)是超時(shí),單位是秒;默認(rèn)一直阻塞。

返回一個(gè)包含三個(gè)元素的元組:列表中的第一個(gè)匹配的正則表達(dá)式的索引;返回的匹配對象;包括匹配在內(nèi)的讀取過的字節(jié)。

如果找到了文件的結(jié)尾且沒有字節(jié)被讀取,觸發(fā) EOFError。否則,當(dāng)沒有匹配時(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è)置了)會被調(diào)用: callback(telnet socket, command (DO/DONT/WILL/WONT), option)。telnetlib 之后不會再執(zhí)行其它操作。

Telnet 示例?

一個(gè)簡單的說明性典型用法例子:

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'))