
Telnet 类图(文本描述)
plaintext
+---------------------------------------+
| Telnet |
+---------------------------------------+
| - host: str | # 目标主机
| - port: int | # 目标端口(默认23)
| - timeout: float | # 超时时间
| - sock: socket.socket | # 底层Socket连接
| - rawq: bytes | # 原始接收缓冲区
| - irawq: int | # 缓冲区索引
| - cookedq: bytes | # 处理后的数据缓冲区
| - option_callback: Callable | # 选项协商回调函数
+---------------------------------------+
| + __init__(host=None, port=0, timeout)| # 初始化对象(可选连接)
| + open(host, port, timeout) | # 建立Telnet连接
| + close() | # 关闭连接
| + read_until(match, timeout=None) | # 读取直到匹配指定字节串
| + read_all() | # 读取所有数据直到EOF
| + write(buffer) | # 发送字节流数据
| + interact() | # 进入交互模式
| - process_rawq() | # 处理原始数据(解析IAC命令)
| - _process_do(option) | # 处理服务端DO请求
| - _process_dont(option) | # 处理服务端DONT请求
| - set_option_negotiation_callback(cb) | # 设置选项协商回调
+---------------------------------------+
核心关系说明
-
依赖关系:
socket
模块 :Telnet
类通过sock
属性依赖底层 Socket 连接。select
模块 :interact()
方法使用select
监听输入输出。
-
数据流:
- 接收数据 :
sock.recv()
→rawq
→process_rawq()
→cookedq
→read_until()
/read_all()
。 - 发送数据 :
write()
→sock.sendall()
。
- 接收数据 :
-
协议处理:
- IAC 命令解析 :
process_rawq()
处理rawq
中的 IAC 序列(如0xFF
),调用_process_do
等方法响应选项协商。 - 回调扩展 :通过
option_callback
支持自定义选项处理逻辑。
- IAC 命令解析 :
关键方法详解
1. read_until(match, timeout)
- 输入 :目标字节串
match
(如b"#"
),超时时间timeout
。 - 输出 :从
cookedq
中提取的字节流,直到匹配match
。 - 流程 :
- 循环填充
rawq
(调用fill_rawq()
)。 - 处理
rawq
中的协议命令(调用process_rawq()
)。 - 检查
cookedq
是否包含match
,若超时则抛出socket.timeout
。
- 循环填充
2. write(buffer)
- 输入 :字节流
buffer
(若为字符串需用户自行编码)。 - 流程 :直接调用
sock.sendall(buffer)
发送数据。 - 注意 :默认不处理编码,需用户确保字节流符合设备要求(如
buffer.encode("gbk")
)。
3. interact()
- 功能:实现用户与远程设备的实时交互。
- 流程 :
- 监听
stdin
和sock
的可读事件(使用select.select()
)。 - 将用户输入发送到设备,设备响应输出到终端。
- 按
Ctrl+]
退出交互模式。
- 监听
示例调用流程
python
tn = Telnet(host="192.168.1.1") # 初始化并连接
tn.read_until(b"Username:") # 读取直到用户名提示
tn.write(b"admin\n") # 发送用户名
tn.read_until(b"Password:") # 读取直到密码提示
tn.write(b"password123\n") # 发送密码
tn.interact() # 进入交互模式
tn.close() # 关闭连接
扩展设计
-
自定义选项处理:
pythondef custom_callback(tn, command, option): if command == DO and option == ECHO: tn.sock.sendall(IAC + WONT + ECHO) # 拒绝回显选项 tn = Telnet() tn.set_option_negotiation_callback(custom_callback)
-
替代方案 :对安全性要求高的场景,建议使用
paramiko
(SSH 协议库)。
通过此图可快速掌握 telnetlib
的核心结构和数据流,便于调试或二次开发。