【问题标题】: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?如何使用 python 获取设备的主机名、别名、IP 地址和规范名称(不要求库读取 /etc/hosts)?
【发布时间】:2018-09-22 17:15:03
【问题描述】:

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

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

我可以通过socket获得这些:

socket.gethostbyaddr('machine-name')

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

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

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

【问题讨论】:

    标签: python sockets dns system dnspython


    【解决方案1】:

    我最终通过 pycares 实现了这一目标。它让我能够在 18 秒内解决 100,000 多个 dns 查询。

    hosts文件是我自己解析的。

    【讨论】:

      【解决方案2】:

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

      否则gethostbyaddr 询问操作系统使用配置的任何源。

      参见手册:

      gethostbyname() 和 gethostbyaddr() 执行的域名查询依赖于名称服务切换 (nsswitch.conf(5)) 配置的源或本地名称服务器 (named(8))。默认 操作是查询名称服务开关 (nsswitch.conf(5)) 配置的源,如果失败,则查询本地名称服务器 (named(8))。

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

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

      hosts: dns
      

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

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

      如果你在这里搜索“dnspython”,你会发现很多关于如何使用它的例子,例如:returning 'A' DNS record in dnspython

      【讨论】:

        猜你喜欢
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-21
        • 1970-01-01
        • 2012-05-31
        相关资源
        最近更新 更多