我有一个脚本,可以从文件中读取地址并使用socket.gethostbyaddr查找其主机名,但是此函数的返回很混乱并且看起来不正确。
它写入目标文件的行如下:
destfile.write(str(socket.gethostbyaddr(ip)))
当它读取 8.8.8.8 时,结果是这样的:
('google-public-dns-a.google.com', [], ['8.8.8.8])
但是,我只需要第一个输出,google-public-dns-a.google.com。我希望让它写入文件并如下所示:
8.8.8.8 resolves to google-public-dns-a.google.com
有人知道如何拆分这个吗?如果需要,可以提供更多代码。
好吧,第一步是将单行分成多行:
host = socket.gethostbyaddr(ip)
现在,你可以做任何你想做的事情。如果您不知道要做什么,请尝试打印出host
并type(host)
。你会发现它是 3 个元素的tuple
(尽管在这种情况下,你可以从写入文件的字符串中猜到这一点),你想要第一个。所以:
hostname = host[0]
或:
hostname, _, addrlist = host
现在,您可以将其写入输出:
destfile.write('{} resolves to {}'.format(ip, hostname))
发现相同信息的另一种方法是查看文档,其中说:
返回一个三元组(主机名、别名列表、ipaddrlist),其中主机名是响应给定ip_address的主要主机名,别名列表是同一地址的备用主机名列表(可能为空),ipaddrlist 是同一主机上同一接口的 IPv4/v6 地址列表(很可能只包含一个地址)。
或者使用解释器中的内置帮助:
>>> help(socket.gethostbyaddr)
gethostbyaddr(host) -> (name, aliaslist, addresslist)
Return the true host name, a list of aliases, and a list of IP addresses,
for a host. The host argument is a string giving a host name or IP number.
您要做的是解压缩包含所需信息的元组。有多种方法可以做到这一点,但这就是我会做的:
(name, _, ip_address_list) = socket.gethostbyaddr(ip)
ip_address = ip_address_list[0]
destfile.write(ip_address + " resolves to " + name)