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(子协商结束)、NOP(无操作)、DM(数据标记)、BRK(中断)、IP(中断进程)、AO(中止输出)、AYT(您在那里吗)、EC(擦除字符)、EL(擦除行)、GA(继续)、SB(子协商开始)。
可用性:不适用于 Emscripten,不适用于 WASI。
此模块在 WebAssembly 平台 wasm32-emscripten
和 wasm32-wasi
上不起作用或不可用。有关详细信息,请参见 WebAssembly 平台。
- 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 协议的定义。
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 中读取所有可以读取的内容,而不阻塞(eager)。
如果连接关闭且没有可用的已处理数据,则引发
EOFError
。否则,如果没有可用的已处理数据,则返回b''
。除非处于 IAC 序列的中间,否则不要阻塞。
- Telnet.read_eager()¶
读取可立即获得的数据。
如果连接关闭且没有可用的已处理数据,则引发
EOFError
。否则,如果没有可用的已处理数据,则返回b''
。除非处于 IAC 序列的中间,否则不要阻塞。
- Telnet.read_lazy()¶
处理并返回已在队列中的数据(lazy)。
如果连接关闭且没有可用数据,则引发
EOFError
。否则,如果没有可用的已处理数据,则返回b''
。除非处于 IAC 序列的中间,否则不要阻塞。
- Telnet.read_very_lazy()¶
返回已处理队列中可用的任何数据(very lazy)。
如果连接关闭且没有可用数据,则引发
EOFError
。否则,如果没有可用的已处理数据,则返回b''
。此方法从不阻塞。
- Telnet.read_sb_data()¶
返回在 SB/SE 对(子选项开始/结束)之间收集的数据。当使用
SE
命令调用回调时,回调应访问这些数据。此方法从不阻塞。
- Telnet.open(host, port=0[, timeout])¶
连接到主机。可选的第二个参数是端口号,默认为标准 Telnet 端口 (23)。可选的 timeout 参数为连接尝试等阻塞操作指定超时时间(以秒为单位)(如果未指定,将使用全局默认超时设置)。
不要尝试重新打开已连接的实例。
引发 审计事件
telnetlib.Telnet.open
,带有参数self
、host
、port
。
- Telnet.msg(msg, *args)¶
当调试级别
>
0 时打印调试消息。如果存在其他参数,则使用标准字符串格式化运算符将它们替换到消息中。
- Telnet.set_debuglevel(debuglevel)¶
设置调试级别。debuglevel 的值越高,您获得的调试输出越多(在
sys.stdout
上)。
- Telnet.close()¶
关闭连接。
- Telnet.get_socket()¶
返回内部使用的套接字对象。
- Telnet.fileno()¶
返回内部使用的套接字对象的文件描述符。
- Telnet.write(buffer)¶
将字节字符串写入套接字,使任何 IAC 字符加倍。如果连接被阻塞,这可能会阻塞。如果连接关闭,可能会引发
OSError
。引发 审计事件
telnetlib.Telnet.write
,带有参数self
、buffer
。3.3 版中已更改:此方法过去会引发
socket.error
,它现在是OSError
的别名。
- Telnet.interact()¶
交互函数,模拟一个非常愚蠢的 Telnet 客户端。
- Telnet.mt_interact()¶
interact()
的多线程版本。
- Telnet.expect(list, timeout=None)¶
读取,直到正则表达式列表中的一个匹配。
第一个参数是正则表达式列表,可以是已编译的(regex 对象)或未编译的(字节字符串)。可选的第二个参数是超时时间(以秒为单位);默认情况下无限期阻塞。
返回一个包含三个元素的元组:第一个匹配的正则表达式在列表中的索引;返回的匹配对象;以及读取到的包括匹配在内的字节。
如果找到文件结尾且没有读取到字节,则引发
EOFError
。否则,当没有任何匹配项时,返回(-1, None, data)
,其中 data 是到目前为止接收到的字节(如果发生超时,则可能是空字节)。如果正则表达式以贪婪匹配结尾(例如
.*
)或如果多个表达式可以匹配相同的输入,则结果是不确定的,并且可能取决于 I/O 时序。
- Telnet.set_option_negotiation_callback(callback)¶
每次在输入流中读取到 telnet 选项时,都会调用此 callback(如果已设置),并带有以下参数:callback(telnet 套接字、命令 (DO/DONT/WILL/WONT)、选项)。之后,telnetlib 不会执行任何其他操作。
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'))