求助:手动输入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
相关产品推荐
相关产品推荐

