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

从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)

关键修改说明

  1. 捕获解析结果:在reverse_dns里接收socket.gethostbyaddr()返回的元组,提取第一个元素(主机名)。
  2. 返回实际结果:reverse_dns不再返回布尔值,而是返回解析后的主机名或None,让调用者能直接拿到有效数据。
  3. 正确收集结果:get_hostname根据reverse_dns的返回值,添加主机名或原IP(按需调整)。
  4. 更清晰的打印信息:打印时同时显示IP和对应的主机名,方便排查。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:20:30