首页 > 解决方案 > 查询 SOA 记录,忽略 dnspython 中的 NoAnswer 错误

问题描述

当我这样做时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 中”

有任何想法吗?

标签: pythondns

解决方案


如文档中所述:

这个 ( dns.resolver.query) 是一个方便的函数,它使用默认的解析器对象来进行查询。

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

但是,如果您查看文档,并且函数签名,您可以看到它具有:raise_on_no_answer=True.

因此,如果您更改代码以添加raise_on_no_answer=Falsequery调用中,您不会得到任何异常,您可以操纵答案。您将需要进入该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

推荐阅读