查询SOA记录,忽略dnspython中的NoAnswer错误

时间:2019-01-21 02:29:46

标签: python dns

当我做dig -t NS www.cloudflare.com时,

;; QUESTION SECTION:
;www.cloudflare.com.        IN  NS

;; AUTHORITY SECTION:
cloudflare.com.     275 IN  SOA ns3.cloudflare.com. dns.cloudflare.com. 2029950661 10000 2400 604800 300

尽管它没有任何答案,但是从权限部分,我仍然可以获得SOA记录。

但是使用dnspython,

answers = dns.resolver.query('www.cloudflare.com', 'SOA')

这只会引发例外:“ DNS响应不包含以下问题的答案:www.cloudflare.com。在SOA中”

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

如文档中所述:

  

此(dns.resolver.query)是一种便捷功能,它使用默认的解析器对象进行查询。

在像您这样的情况下,它会引发异常“ dns.resolver.NoAnswer”,该异常正确且定义正确,因为确实没有针对该特定名称的答案。 对于相同的名称和其他类型,可能会有答案,但对于特定类型则没有答案。

但是,如果您查看文档和功能签名,您会发现它具有以下内容:raise_on_no_answer=True

因此,如果您更改代码以在raise_on_no_answer=False调用中添加query,则不会出现任何异常,您可以操纵答案。您将需要进入response部分。当然,您需要在下面的代码中添加很多检查,以使其能够应对各种极端情况。

answer = dns.resolver.query('www.cloudflare.com', 'SOA', raise_on_no_answer=False)
if answer.rrset is None:
    print answer.response.authority[0].to_text()


cloudflare.com. 139 IN SOA ns3.cloudflare.com. dns.cloudflare.com. 2029950661 10000 2400 604800 300