【问题标题】:Resolve hostname with Python (via DNS)使用 Python 解析主机名(通过 DNS)
【发布时间】:2019-01-24 04:48:20
【问题描述】:

我想用 Python 解析主机名。

但是,我不希望 /etc/hosts 被使用。

我的用例是检查 DNS 是否正常工作。

如何在 Python 中通过 DNS 强制进行名称解析?

【问题讨论】:

标签: python dns


【解决方案1】:

Python 最常用的 DNS 库似乎是dnspython。之后,看到这个答案:https://stackoverflow.com/a/6947181/4822566

【讨论】:

    【解决方案2】:

    您通常不需要特定的 Python 库来解析主机名,因为这是核心 libc 功能,因此也是任何编程语言的核心功能。这是在您的问题不是特定于使用 DNS 时编写的,在这种情况下,使用 DNS 库当然是唯一的解决方案。对于 Python 中名称的通用解析,以下文本仍然正确。

    参见https://docs.python.org/3.8/library/socket.html#socket.getaddrinfo 的socket.getaddrinfo,其描述为:

    将主机/端口参数转换为 5 元组序列,其中包含创建连接到该服务的套接字所需的所有参数。

    该函数返回具有以下结构的 5 元组列表:

    (family, type, proto, canonname, sockaddr)

    和他们的例子:

    >>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP) 
    [(<AddressFamily.AF_INET6: 10>, <SocketType.SOCK_STREAM: 1>,  6, '',   
    ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
    (<AddressFamily.AF_INET: 2>, <SocketType.SOCK_STREAM: 1>,  6, '',
    ('93.184.216.34', 80))]
    

    这可能会或可能不会使用 DNS,因为 libc 将使用 /etc/resolv.conf/etc/gai.conf/etc/nsswitch.conf/etc/hosts(通常在 Unix 系统上)来决定如何解析名称以及在何处解析。

    至于

    我的用例是检查 DNS 是否正常工作。

    这太模糊了。您如何定义“DNS 正在工作”?您的意思是您的特定递归名称服务器回复?还是某个遥远的?还是 DNSSEC 已激活?或者答案是否被欺骗?或者某些特定的域名是否正确配置并响应 DNS 查询?等等

    【讨论】:

    • 您的解决方案使用 /etc/hosts,在这种特殊情况下不应该这样做。用例很奇怪,但这就是问题所在。在这种情况下,最不使用文件 /etc/hosts。我想检查 dns 服务器是否可以访问并返回一个理智的结果来解析当前主机的名称。 DNSSEC 或递归解析在这里无关紧要。您的问题是有效的,但它是对稍微不同的问题的有效答案。
    • 您的解决方案使用 /etc/hosts 不一定正确,这取决于 nsswitch.conf 的配置方式。对于您的标题“在 Python 中解析主机名”,上述方法有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2019-04-30
    • 1970-01-01
    • 2021-10-08
    • 2011-08-21
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多