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 模塊提供一個實現(xiàn)Telnet協(xié)議的類 Telnet。關于此協(xié)議的細節(jié)請參見 RFC 854 。此外,它還為協(xié)議字符(見下文)和 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() 方法來建立連接?;蛘撸?可選參數(shù) host 和 port 也可以傳遞給構造函數(shù),在這種情況下,到服務器的連接將在構造函數(shù)返回前建立??蛇x參數(shù) timeout 為阻塞操作(如連接嘗試)指定一個以秒為單位的超時時間(如果沒有指定,將使用全局默認設置) 。

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

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

Telnet 對象一個上下文管理器,可以在 with 語句中使用。當 with 塊結束,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 實例有以下幾種方法:

Telnet.read_until(expected, timeout=None)?

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

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

Telnet.read_all()?

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

Telnet.read_some()?

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

Telnet.read_very_eager()?

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

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

Telnet.read_eager()?

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

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

Telnet.read_lazy()?

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

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

Telnet.read_very_lazy()?

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

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

Telnet.read_sb_data()?

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

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

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

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

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

Telnet.msg(msg, *args)?

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

Telnet.set_debuglevel(debuglevel)?

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

Telnet.close()?

關閉連接對象。

Telnet.get_socket()?

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

Telnet.fileno()?

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

Telnet.write(buffer)?

向套接字寫入一個字節(jié)字符串,將所有 IAC 字符加倍。如果連接被阻塞,這可能也會阻塞。如果連接關閉可能觸發(fā) OSError。

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

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

Telnet.interact()?

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

Telnet.mt_interact()?

多線程版的 interact().

Telnet.expect(list, timeout=None)?

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

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

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

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

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

Telnet.set_option_negotiation_callback(callback)?

每次在輸入流上讀取 telnet 選項時,這個帶有如下參數(shù)的 callback (如果設置了)會被調(diào)用: 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'))