我们如何从dnspython获取TXT,CNAME和SOA记录?

Sha*_*esh 12 python dns dnspython

我需要有一个dns查询功能来查询服务器的各种记录.我想出了如何获得MX记录(大多数例子都显示了这一点),A记录和NS记录.如何获取TXT,CNAME和SOA记录?

示例代码段:

   import dns.resolver
   answer=dns.resolver.query("google.com", "A")
       for data in answer:
           print data.address
Run Code Online (Sandbox Code Playgroud)

我尝试用TXT和data.address对象替换查询类型与data.text,data.data等,但最终导致属性错误.我之前提到的数据类型有哪些参考?

Lar*_*din 22

(回答如何弄清楚返回的数据)

您可以以类似的方式获取TXT,CNAME和SOA记录,但您必须根据DNS响应对象获取正确的属性.

使用内置的python dir()是您的朋友,也是确定DNS响应对象中存在哪些属性的一种方法 - 当API文档不可用时很方便.

要确定适当的属性,请暂时将for循环更改为以下内容:

   for data in answer:
       print dir(data)
       print data
Run Code Online (Sandbox Code Playgroud)

另一种更快捷的方法是查看dnspython的API文档,这些页面列出了每个返回对象的属性.

最后,如果库是在python中,或者如果没有,则可以查看源代码,如果C代码可用,则可以查看源代码.

(并回答你的问题:)

以下是TXT,CNAME和SOA查询的示例:

文本

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.txtbase.TXTBase-class.html#section-InstanceVariables

answers = dns.resolver.query('google.com', 'TXT')
print ' query qname:', answers.qname, ' num ans.', len(answers)
for rdata in answers:
    for txt_string in rdata.strings:
      print ' TXT:', txt_string
Run Code Online (Sandbox Code Playgroud)

CNAME

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.ANY.CNAME.CNAME-class.html

answers = dns.resolver.query('mail.google.com', 'CNAME')
print ' query qname:', answers.qname, ' num ans.', len(answers)
for rdata in answers:
    print ' cname target address:', rdata.target
Run Code Online (Sandbox Code Playgroud)

SOA

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.ANY.SOA.SOA-class.html#section-InstanceVariables

answers = dns.resolver.query('google.com', 'SOA')
print 'query qname:', answers.qname, ' num ans.', len(answers)
for rdata in answers:
    print ' serial: %s  tech: %s' % (rdata.serial, rdata.rname)
    print ' refresh: %s  retry: %s' % (rdata.refresh, rdata.retry)
    print ' expire: %s  minimum: %s' % (rdata.expire, rdata.minimum)
    print ' mname: %s' % (rdata.mname)
Run Code Online (Sandbox Code Playgroud)


Men*_*kov 9

你可以尝试一些不同的东西.

您可以对任何记录进行单个查询,而不是每次记录每种类型的查询.这样,如果该域同时具有TXT,CNAME等...您将获得一个包含所有数据的对象.

from dns.resolver import dns
name_server = '8.8.8.8' #Google's DNS server
ADDITIONAL_RDCLASS = 65535
request = dns.message.make_query('google.com', dns.rdatatype.ANY)
request.flags |= dns.flags.AD
request.find_rrset(request.additional, dns.name.root, ADDITIONAL_RDCLASS,
                       dns.rdatatype.OPT, create=True, force_unique=True)       
response = dns.query.udp(request, name_server)
Run Code Online (Sandbox Code Playgroud)

希望这可能对你有所帮助.

  • 不,不要做"任何".与流行的理解相反,它不是**"ALL"的同义词,它只会为您提供缓存在其内容中的含义,当然不是所有记录(取决于其活动).此外,这已经过滤了,IETF中的工作只是使`ANY`过时了.所以无论你的问题是什么,"ANY"都不是你的解决方案. (2认同)