telnetlib -- Telnet 客戶(hù)端?

源代碼: 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í)現Telnet協(xié)議的類(lèi) Telnet。關(guān)于此協(xié)議的細節請參見(jiàn) RFC 854 。此外,它還為協(xié)議字符(見(jiàn)下文)和 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 服務(wù)器的連接. 實(shí)例初始化后默認不連接;必須使用 open() 方法來(lái)建立連接?;蛘?, 可選參數 host 和 port 也可以傳遞給構造函數,在這種情況下,到服務(wù)器的連接將在構造函數返回前建立??蛇x參數 timeout 為阻塞操作(如連接嘗試)指定一個(gè)以秒為單位的超時(shí)時(shí)間(如果沒(méi)有指定,將使用全局默認設置) 。

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

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

Telnet 對象一個(gè)上下文管理器,可以在 with 語(yǔ)句中使用。當 with 塊結束,close() 方法會(huì )被調用:

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

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

參見(jiàn)

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

Telnet 協(xié)議的定義。

Telnet 對象?

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

Telnet.read_until(expected, timeout=None)?

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

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

Telnet.read_all()?

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

Telnet.read_some()?

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

Telnet.read_very_eager()?

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

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

Telnet.read_eager()?

讀取現成的數據。

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

Telnet.read_lazy()?

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

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

Telnet.read_very_lazy()?

返回熟數據隊列任何可用的數據(very lazy)。

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

Telnet.read_sb_data()?

返回在 SB/SE 對之間收集的數據(子選項 begin/end)。當使用 SE 命令調用回調函數時(shí),該回調函數應該訪(fǎng)問(wèn)這些數據。該方法永遠不會(huì )阻塞。

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

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

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

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

Telnet.msg(msg, *args)?

當調試級別 > 0 時(shí)打印一條調試信息。如果存在額外參數,則它們會(huì )被替換在使用標準字符串格式化操作符的信息中。

Telnet.set_debuglevel(debuglevel)?

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

Telnet.close()?

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

Telnet.get_socket()?

返回內部使用的套接字對象。

Telnet.fileno()?

返回內部使用的套接字對象的文件描述符。

Telnet.write(buffer)?

向套接字寫(xiě)入一個(gè)字節字符串,將所有 IAC 字符加倍。如果連接被阻塞,這可能也會(huì )阻塞。如果連接關(guān)閉可能觸發(fā) OSError。

觸發(fā) auditing event telnetlib.Telnet.write ,參數為 self,buffer。

在 3.3 版更改: 曾經(jīng)該函數拋出 socket.error,現在這是 OSError 的別名。

Telnet.interact()?

交互函數,模擬一個(gè)非常笨拙的 Telnet 客戶(hù)端。

Telnet.mt_interact()?

多線(xiàn)程版的 interact().

Telnet.expect(list, timeout=None)?

一直讀取,直到匹配列表中的某個(gè)正則表達式。

第一個(gè)參數是一個(gè)正則表達式列表,可以是已編譯的 (正則表達式對象),也可以是未編譯的 (字節串)。 第二個(gè)可選參數是超時(shí),單位是秒;默認一直阻塞。

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

如果找到了文件的結尾且沒(méi)有字節被讀取,觸發(fā) EOFError。否則,當沒(méi)有匹配時(shí),返回 (-1, None, data),其中 data 是到目前為止接受到的字節(如果發(fā)生超時(shí),則可能是空字節)。

如果一個(gè)正則表達式以貪婪匹配結束(例如 .*),或者多個(gè)表達式可以匹配同一個(gè)輸出,則結果是不確定的,可能取決于 I/O 計時(shí)。

Telnet.set_option_negotiation_callback(callback)?

每次在輸入流上讀取 telnet 選項時(shí),這個(gè)帶有如下參數的 callback (如果設置了)會(huì )被調用: callback(telnet socket, command (DO/DONT/WILL/WONT), option)。telnetlib 之后不會(huì )再執行其它操作。

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