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

求助:手动输入IP列表脚本正常,读取txt触发gaierror: [Errno 11001]

解决 gaierror: [Errno 11001] getaddrinfo failed 问题

嘿,这个问题我太熟悉了!你遇到的这个错误本质是系统无法解析你提供的主机地址,核心问题出在你读取IP列表的方式上,我给你拆解清楚:

问题根源

当你用file.readlines()读取txt文件时,它会把每一行的**全部内容(包括末尾的换行符\n)**都存入列表。比如你的ips.txt里写的是192.168.1.1,读出来的元素其实是"192.168.1.1\n"——带了个隐藏的换行符。

telnetlib拿着这个带换行的字符串去尝试连接,系统根本识别不了这是个合法的IP地址,自然就触发了getaddrinfo failed的解析错误。而你手动添加IP时,直接写的是干净的字符串(比如HOST = ["192.168.1.1"]),没有多余的换行符,所以能正常运行。

修正后的代码

我给你调整了文件读取的逻辑,同时优化了代码的健壮性:

import telnetlib
from __future__ import with_statement

# 用with语句自动管理文件,避免忘记关闭文件导致资源泄漏
with open('ips.txt', 'r') as file:
    # 读取每一行并去掉前后空白(包括换行符、空格),同时过滤空行
    HOST = [line.strip() for line in file if line.strip()]

user = "root"
password = "root"

# 直接遍历IP列表,比用range(len(HOST))更简洁
for ip in HOST:
    try:
        tn = telnetlib.Telnet(ip)
        tn.read_until("login: ")
        tn.write(user + "\n")
        tn.read_until("Password: ")
        tn.write(password + "\n")
        tn.write("show slot info\n")
        tn.write("exit\n")
        string = str(tn.read_all())
        print(string)
        for line in string.splitlines():
            if line.startswith('Temperature:'):
                # 修正原代码的语法错误,提取温度值并输出
                temperature = line[34:36]
                print(f"检测到温度: {temperature}")
    except Exception as e:
        # 单个IP连接失败时,打印错误信息并继续处理下一个IP
        print(f"连接IP {ip} 失败: {str(e)}")

关键优化点

  • line.strip():去掉每行前后的空白字符(换行符、空格、制表符等),确保IP地址是干净的可解析格式。
  • 过滤空行:if line.strip()可以跳过文件里的空行,避免循环到空字符串导致的额外错误。
  • try-except块:捕获单个IP连接失败的异常,不会因为某一个IP出问题导致整个脚本中断。
  • 更简洁的遍历方式:直接用for ip in HOST代替range(len(HOST)),代码可读性更高。

内容的提问来源于stack exchange,提问作者rares balta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:34:59