2011-05-05 87 views
1

我正在学习如何使用python dns对象。快速的问题,因为我看到很多例子显示了与DNS记录类型(CNAME,NS等)一起使用dns.resolver方法的方法。有没有办法使用这个DNS对象来查询DNS名称并将其解析为记录类型。类似于DIG在答案部分提供的内容。python dns.resolver获取DNS记录类型

感谢,

吉姆

+0

我与rdtype和rdclass但每次测试好惹的类型我做返回一个记录类型,即使当我把它比作掏它不是A记录。 – Jim 2011-05-05 19:33:40

回答

0

看起来你需要推出自己的解析器类。通过调用dns.resolver.query返回的Answer对象只包含特定匹配请求的记录,缺省情况下恰好是A记录。一切都在那里,一路上都失踪了。如果你打印回应,你可以看到我的意思。

#!/usr/bin/env python 

import dns.resolver 

answer = dns.resolver.query('www.clarkmania.com') 
print answer.response 
print "------" 
print answer.rrset 
1

这个怎么样?

In [1]: import dns.resolver 

In [2]: dns.resolver.query('chipy.org').__dict__ 
Out[2]: 
{'canonical_name': <DNS name chipy.org.>, 
'expiration': 1304632023.2383349, 
'qname': <DNS name chipy.org.>, 
'rdclass': 1, 
'rdtype': 1, 
'response': <DNS message, ID 64039>, 
'rrset': <DNS chipy.org. IN A RRset>} 
2

这里有一个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 recs)。

1

迄今为止,我发现的唯一一个检查来确定它是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..." 
1

你可以得到rdatatype

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