如何用telnetlib3实现原telnetlib的多步骤Telnet交互示例?
使用telnetlib3实现多步骤Telnet交互(替代已弃用的telnetlib)
以下是对应旧版telnetlib官方示例的telnetlib3改写版本,基于asyncio实现完整的登录、执行命令、退出流程:
import asyncio import telnetlib3 async def telnet_session(host, port, username, password): # 建立异步Telnet连接 reader, writer = await telnetlib3.open_connection(host, port) # 匹配登录提示符并输入用户名 login_prompt = await reader.readuntil(b"login: ") print(login_prompt.decode(), end="") writer.write(f"{username}\r\n") await writer.drain() # 匹配密码提示符并输入密码 pass_prompt = await reader.readuntil(b"Password: ") print(pass_prompt.decode(), end="") writer.write(f"{password}\r\n") await writer.drain() # 匹配命令行提示符,执行ls命令 # 根据实际服务器提示符调整,比如改为b"# "或b"$ " cmd_prompt = await reader.readuntil(b"$ ") print(cmd_prompt.decode(), end="") writer.write("ls\r\n") await writer.drain() # 读取ls命令输出直到提示符再次出现 ls_output = await reader.readuntil(b"$ ") print(ls_output.decode(), end="") # 发送退出命令并关闭连接 writer.write("exit\r\n") await writer.drain() await writer.close() if __name__ == "__main__": # 替换为你的Telnet服务器参数 TELNET_HOST = "your-server-ip" TELNET_PORT = 23 USER = "your-username" PASS = "your-password" asyncio.run(telnet_session(TELNET_HOST, TELNET_PORT, USER, PASS))
关键说明
- 所有IO操作都用
await修饰,因为telnetlib3基于asyncio异步模型 reader.readuntil(b"xxx")和旧版telnetlib.Telnet.read_until逻辑一致,需传入字节串形式的提示符writer.write()发送内容后必须调用await writer.drain(),确保数据完全发送到服务器- 需根据实际Telnet服务器的提示符调整
readuntil中的匹配串(比如有些服务器用Login:大写开头,或#作为管理员提示符) - 若需超时控制,可给
readuntil添加timeout参数,例如await reader.readuntil(b"login: ", timeout=10)
内容的提问来源于stack exchange,提问作者gwideman
相关产品推荐
相关产品推荐

