【发布时间】:2019-01-24 04:48:20
【问题描述】:
我想用 Python 解析主机名。
但是,我不希望 /etc/hosts 被使用。
我的用例是检查 DNS 是否正常工作。
如何在 Python 中通过 DNS 强制进行名称解析?
【问题讨论】:
-
使用 dnspython 库,详情请参见此处评分最高的答案:stackoverflow.com/questions/3898363/…
我想用 Python 解析主机名。
但是,我不希望 /etc/hosts 被使用。
我的用例是检查 DNS 是否正常工作。
如何在 Python 中通过 DNS 强制进行名称解析?
【问题讨论】:
Python 最常用的 DNS 库似乎是dnspython。之后,看到这个答案:https://stackoverflow.com/a/6947181/4822566
【讨论】:
您通常不需要特定的 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 查询?等等
【讨论】:
nsswitch.conf 的配置方式。对于您的标题“在 Python 中解析主机名”,上述方法有效。