【问题标题】:python dns.resolver get DNS record typepython dns.resolver 获取 DNS 记录类型
【发布时间】:2011-08-19 16:10:03
【问题描述】:

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

谢谢,

吉姆

【问题讨论】:

  • 我搞砸了 rdtype 和 rdclass 但我所做的每个测试都返回 A 记录类型,即使当我将它与 Dig 进行比较时它不是 A 记录。

标签: python dns resolver


【解决方案1】:

你可以通过rdatatype获取类型

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

【讨论】:

    【解决方案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 = 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 记录)。

      【讨论】:

        【解决方案4】:

        这个怎么样?

        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>}
        

        【讨论】:

          【解决方案5】:

          看来您需要推出自己的 Resolver 类。调用 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-06-11
            • 2017-05-13
            • 2010-11-12
            • 2010-09-10
            • 2013-01-08
            • 1970-01-01
            • 2020-07-10
            • 2013-09-18
            相关资源
            最近更新 更多