如何使用 python 获取设备的主机名、别名、IP 地址和规范名称(不要求库读取 /etc/hosts)?

How can I get the hostname, aliases, ip address, and canonical name of a device (without asking a library to read /etc/hosts) using python?

我想获取有关给定标识符的设备的这些字段:

主机名、别名、IP 地址和规范名称

我可以使用套接字获得这些:

socket.gethostbyaddr('machine-name')

然而,每次套接字调用都会打开主机文件 (/etc/hosts) 并将其读入。我想跳过这一步。

要么我希望套接字只打开主机文件一次(并保存数据),要么我希望套接字跳过查看主机文件并进行 DNS 查找(我将自己读取主机文件)。

我尝试使用 dnspython 的解析器来执行此操作,但我不知道如何为我想要的字段解析返回的结果。

如果您需要绝对且唯一的 DNS 查询,请进行 DNS 查询!

否则 gethostbyaddr 询问 OS 使用任何配置的来源。

从手册中看到这个:

The domain name queries carried out by gethostbyname() and gethostbyaddr() rely on the Name Service Switch (nsswitch.conf(5)) configured sources or a local name server (named(8)). The default action is to query the Name Service Switch (nsswitch.conf(5)) configured sources, failing that, a local name server (named(8)).

因此您可以查看 nsswitch.conf 的手册以了解更多相关信息。

如果你控制主机,你可以编辑文件并放入其中:

hosts: dns

然后您将确定 gethostbyaddr 仅查询 DNS。

但是如果您的应用程序应该在各种主机上执行,并且您需要进行 DNS 查询,那么只需使用适当的库进行 DNS 查询即可。

如果您在 "dnspython" 上进行搜索,您会找到许多有关如何使用它的示例,例如:

我最终用 pycares 实现了这一点。它使我能够在 18 秒内解决 100,000 多个 dns 查询。

hosts文件是我自己解析的。