解决Python中Telnet会话输出同时显示终端并写入文件的报错
解决Telnet会话输出同时显示在终端并写入文件的问题
你的报错原因很明确:当你取消注释那三行修改sys.stdout的代码后,你把标准输出重定向到了文件,然后执行sys.stdout.close()关闭了它。之后再运行print output的时候,程序尝试往已经关闭的标准输出流写入,自然就抛出了ValueError: I/O operation on closed file。
不要直接修改系统的标准输出,这会破坏后续的终端输出功能。更简单可靠的方式是先获取Telnet的完整输出内容,再分别把内容打印到终端和写入文件。
这里是修正后的完整脚本:
import sys import telnetlib user = "xxx" password = "xxx" # 处理hosts.txt文件,注意跳过空行 with open("hosts.txt", "r") as file: for line in file: line = line.strip() # 去掉换行和首尾空格,避免空行导致连接错误 if not line: continue # 跳过空行 try: # 建立Telnet连接 tn = telnetlib.Telnet(line) tn.read_until(b"Username: ") # 注意这里要传字节串,Python3需要,Python2也兼容 tn.write(user.encode('ascii') + b"\n") tn.read_until(b"Password: ") tn.write(password.encode('ascii') + b"\n") tn.write(b"enable \n") tn.write(password.encode('ascii') + b"\n") # 可以添加你需要执行的命令,比如dir tn.write(b"dir\n") tn.write(b"exit \n") # 获取所有会话输出 output = tn.read_all().decode('ascii') # 字节串转字符串 # 1. 显示在终端 print(f"=== 设备 {line} 的输出 ===") print(output) # 2. 写入对应文件 with open(f"{line}.txt", "w") as out_file: out_file.write(output) print(f"=== 设备 {line} 的输出已保存到 {line}.txt ===\n") except Exception as e: print(f"连接设备 {line} 出错: {str(e)}\n")
关键改进点:
- 使用
with语句处理文件,自动关闭文件句柄,避免资源泄漏 - 先读取完整的Telnet输出到变量
output,再分别处理终端打印和文件写入,完全不需要修改sys.stdout - 添加了异常处理,避免单个设备连接失败导致整个脚本中断
- 处理了
hosts.txt中的空行问题,防止无效连接 - 统一使用字节串与
telnetlib交互(Python3要求,Python2也能正常运行)
这样修改后,每个设备的Telnet输出会同时显示在Windows终端,并且保存为对应设备地址命名的txt文件,再也不会出现I/O关闭的错误了。
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

