python dns.resolver 获取 DNS 记录类型

4 投票
5 回答
22515 浏览
提问于 2025-04-16 17:04

我正在学习如何使用Python的DNS对象。有个简单的问题,我看到很多例子展示了如何用dns.resolver方法来处理不同类型的DNS记录(比如CNAME、NS等)。请问有没有办法用这个DNS对象来查询一个DNS名称,并获取它的解析结果和记录类型?就像DIG命令在回答部分提供的那样。

谢谢,

吉姆

5 个回答

2

到目前为止,我找到的唯一方法来判断这是A记录还是CNAME记录,就是检查一下qname属性是否和canonical_name属性相等。

answer = dns.resolver.query('www.example.com')
if answer.qname == answer.canonical_name:
    print "This is A record"
else:
    print "This isn't A, probably CNAME..."
3

这里有一个CNAME的例子:

>>> cname = dns.resolver.query("mail.unixy.net", 'CNAME')
>>> for i in cname.response.answer:
...     for j in i.items:
...             print j.to_text()
... 
unixy.net.

TXT记录:

>>> txt = dns.resolver.query("unixy.net", 'TXT')
>>> for i in txt.response.answer:
...     for j in i.items:
...             print j.to_text()
... 
"v=spf1 ip4:..."

NS记录:

>>> ns = dns.resolver.query("unixy.net", 'NS')
>>> for i in ns.response.answer:
...     for j in i.items:
...             print j.to_text()
... 
ns2.unixy.net.
ns1.unixy.net.

你可以按照相同的方式获取大部分记录。多个响应的查询结果会存储在一个列表里。所以有时候需要用循环来处理这些结果(比如多个A记录和NS记录)。

5

你可以通过 rdatatype 来获取类型

>>> import dns.resolver
>>> answer = dns.resolver.query('google.com')
>>> rdt = dns.rdatatype.to_text(answer.rdtype)
>>> print(rdt)
A

撰写回答