代码之家  ›  专栏  ›  技术社区  ›  daisy

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

  •  0
  • daisy  · 技术社区  · 6 年前

    当我这样做的时候 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 回复  |  直到 6 年前
        1
  •  1
  •   Patrick Mevzek James Dean    6 年前

    如文件所述:

    这个( dns.resolver.query )是一个方便函数,使用默认的冲突解决程序对象进行查询。

    像您的情况一样,它会引发异常“dns.resolver.no answer”,这是正确的,并且是定义好的,因为确实没有这个特定名称的答案。 类型。 可能有相同名称和其他类型的答案,但请注意特定类型的答案。

    但是,如果您查看文档和函数签名,可以看到它具有以下特性: 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