telnetlib — Telnet 客户端 — Python 文档

来自菜鸟教程
Python/docs/3.8/library/telnetlib
跳转至:导航、​搜索

telnetlib — Telnet 客户端

源代码: :source:`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(子协商开始)。

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 中不阻塞的内容(急切)。

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

Telnet.read_eager()

阅读现成的数据。

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

Telnet.read_lazy()

处理并返回队列中已有的数据(惰性)。

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

Telnet.read_very_lazy()

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

如果连接关闭且没有可用数据,则引发 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)

从正则表达式列表中读取直到匹配。

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

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

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

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

Telnet.set_option_negotiation_callback(callback)
每次在输入流上读取 telnet 选项时,都会使用以下参数调用此 callback(如果设置):回调(telnet 套接字,命令(DO/DONT/WILL/WONT),选项)。 之后 telnetlib 不会执行其他操作。


远程登录示例

一个说明典型用途的简单示例:

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