如何拆分套接字,gethostbyaddr的返回和写入文件



我有一个脚本,可以从文件中读取地址并使用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)

现在,你可以做任何你想做的事情。如果您不知道要做什么,请尝试打印出hosttype(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)

相关内容

  • 没有找到相关文章

最新更新