Skip to main content

21.19. telnetlib — Telnet客户端

源代码: Lib/telnetlib.py


telnetlib 模块提供实现Telnet协议的 Telnet 类。有关协议的详细信息,请参阅 RFC 854。此外,它还为协议字符(见下文)和telnet选项提供符号常量。 telnet选项的符号名称遵循 arpa/telnet.h 中的定义,删除前导 TELOPT_。对于传统上不包括在 arpa/telnet.h 中的选项的符号名称,请参阅模块源本身。

telnet命令的符号常量有:IAC,DONT,DO,WONT,WILL,SE(subnegotiation end),NOP(无操作),DM(数据标记),BRK中止输出),AYT(您有),EC(擦除字符),EL(擦除线),GA(前进),SB(子协商开始)。

class telnetlib.Telnet(host=None, port=0[, timeout])

Telnet 表示到Telnet服务器的连接。实例最初未默认连接;必须使用 open() 方法来建立连接。或者,主机名和可选端口号也可以传递给构造函数,在这种情况下,将在构造函数返回之前建立与服务器的连接。可选的 timeout 参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。

不要重新打开已连接的实例。

这个类有很多 read_*() 方法。注意,当读取连接结束时,其中一些引发 EOFError,因为它们可能由于其他原因返回一个空字符串。请参阅下面的各个说明。

Telnet 对象是上下文管理器,可以在 with 语句中使用。当 with 块结束时,调用 close() 方法:

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

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

参见

RFC 854 - Telnet协议规范

Telnet协议的定义。

21.19.1. Telnet对象

Telnet 实例有以下方法:

Telnet.read_until(expected, timeout=None)

读取直到遇到给定的字节字符串 expected,或者直到 timeout 秒过去。

当找不到匹配项时,返回可用的可用空间,可能为空字节。如果连接已关闭且没有可用的已烹饪数据,请升高 EOFError

Telnet.read_all()

读取所有数据,直到EOF为字节;阻塞直到连接关闭。

Telnet.read_some()

读取至少一个字节的熟食数据,除非命中EOF。如果EOF命中,返回 b''。如果没有数据立即可用,则阻止。

Telnet.read_very_eager()

读取I/O(热切)中可以不阻塞的所有内容。

如果连接关闭并且没有可用的已烹饪数据,请升高 EOFError。如果没有熟的数据,返回 b'' 否则。除非在IAC序列中间,否则不要阻塞。

Telnet.read_eager()

阅读随时可用的数据。

如果连接关闭并且没有可用的已烹饪数据,请升高 EOFError。如果没有熟的数据,返回 b'' 否则。除非在IAC序列中间,否则不要阻塞。

Telnet.read_lazy()

处理和返回队列中已有的数据(lazy)。

如果连接关闭且无可用数据,则提高 EOFError。如果没有熟的数据,返回 b'' 否则。除非在IAC序列中间,否则不要阻塞。

Telnet.read_very_lazy()

返回在cooked队列中可用的任何数据(非常懒惰)。

如果连接关闭且无可用数据,则提高 EOFError。如果没有熟的数据,返回 b'' 否则。这种方法永远不会阻塞。

Telnet.read_sb_data()

返回在SB/SE对之间收集的数据(子选项开始/结束)。回调应该在使用 SE 命令调用时访问这些数据。这种方法永远不会阻塞。

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

连接到主机。可选的第二个参数是端口号,默认为标准Telnet端口(23)。可选的 timeout 参数指定阻塞操作(如连接尝试)的超时(以秒为单位)(如果未指定,将使用全局默认超时设置)。

不要尝试重新打开已连接的实例。

Telnet.msg(msg, *args)

当调试级别为 > 0时,打印调试消息。如果存在额外的参数,则使用标准字符串格式化运算符在消息中替换它们。

Telnet.set_debuglevel(debuglevel)

设置调试级别。 debuglevel 的值越高,您获得的调试输出(在 sys.stdout 上)就越多。

Telnet.close()

关闭连接。

Telnet.get_socket()

返回内部使用的套接字对象。

Telnet.fileno()

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

Telnet.write(buffer)

写一个字节字符串到套接字,加倍任何IAC字符。这可以阻止连接被阻止。如果连接关闭,可能会产生 OSError

在 3.3 版更改: 此方法用于提高 socket.error,现在是 OSError 的别名。

Telnet.interact()

交互功能,模拟一个非常愚蠢的Telnet客户端。

Telnet.mt_interact()

多线程版本的 interact()

Telnet.expect(list, timeout=None)

直到从正则表达式列表中找到一个匹配。

第一个参数是正则表达式的列表,或者编译(正则表达式对象)或者未编译(字节字符串)。可选的第二个参数是超时,以秒为单位;默认是无限期阻塞。

返回三个项的元组:匹配的第一个正则表达式的列表中的索引;返回匹配对象;和字节读取直到并包括匹配。

如果找到文件结尾且未读取任何字节,请升高 EOFError。否则,当没有匹配时,返回 (-1, None, data),其中 data 是到目前为止接收的字节(如果超时发生,可以是空字节)。

如果正则表达式以贪婪匹配(例如 .*)结束或者如果多个表达式可以匹配相同的输入,则结果是非确定性的,并且可能取决于I/O定时。

Telnet.set_option_negotiation_callback(callback)

每次在输入流上读取telnet选项时,将使用以下参数调用此 callback (如果设置):回调(telnet套接字,命令(DO/DONT/WILL/WONT),选项)。以后没有其他操作通过telnetlib。

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