You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:53:57