从IP与主机名列表获取主机名异常:解析IP仅返回IP而非主机名
问题分析与修复
你的代码没拿到主机名的核心原因是完全没使用socket.gethostbyaddr()的返回结果,反而直接打印了输入的IP。下面是具体问题和修复方案:
原代码的问题点
reverse_dns函数里,调用socket.gethostbyaddr(IP)后没有保存返回值,这个函数实际会返回元组(hostname, aliaslist, ipaddrlist),你直接跳过了这个结果,打印的还是输入的IP。get_hostname函数里,成功解析后添加的是原始IP,不是解析出的主机名。- 返回布尔值的设计不利于传递解析后的实际结果,应该直接返回主机名或标记失败的内容。
修复后的代码
import socket import pandas as pd def reverse_dns(ip): try: # 捕获gethostbyaddr的返回结果,第一个元素就是主机名 hostname, _, _ = socket.gethostbyaddr(ip) print(f"Found hostname {hostname} for IP {ip}") return hostname except socket.error: print(f"Failed to resolve hostname for IP {ip}") # 解析失败时可以返回None,或者直接返回原IP,根据需求调整 return None def get_hostname(ip_list): hostnames = [] for ip in ip_list: hostname = reverse_dns(ip) # 如果解析成功就加主机名,失败可以选择不加或者加原IP if hostname: hostnames.append(hostname) else: # 可选:解析失败时保留原IP hostnames.append(ip) return hostnames # 假设df是你的DataFrame,ips列是IP列表 df['hostname'] = df['ips'].apply(get_hostname)
关键修改说明
- 捕获解析结果:在
reverse_dns里接收socket.gethostbyaddr()返回的元组,提取第一个元素(主机名)。 - 返回实际结果:
reverse_dns不再返回布尔值,而是返回解析后的主机名或None,让调用者能直接拿到有效数据。 - 正确收集结果:
get_hostname根据reverse_dns的返回值,添加主机名或原IP(按需调整)。 - 更清晰的打印信息:打印时同时显示IP和对应的主机名,方便排查。
内容的提问来源于stack exchange,提问作者Calarian
相关产品推荐
相关产品推荐

