15

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

示例代码片段:

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

我尝试用 TXT 替换查询类型,用 data.text、data.data 等替换 data.address 对象,但最终出现属性错误。我之前提到的数据类型的参考是什么?

4

3 回答 3

28

(回答如何找出返回的数据)

您可以通过类似的方式获取 TXT、CNAME 和 SOA 记录,但您只需要根据 DNS 响应对象获取正确的属性。

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

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

   for data in answer:
       print dir(data)
       print data

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

最后,如果库在 python 中,您可以查看源代码,如果不是,则 C 代码是否可用。

(并回答你的问题:)

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

TXT

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

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

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)
于 2013-01-06T02:41:35.013 回答
11

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

您可以对任何记录进行一次查询,而不是每次查询每个记录类型。这样,如果该域同时具有 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)

希望这可以帮助你。

于 2014-03-05T13:40:25.870 回答
2

以先前的答案为例,使用以下命令创建 dnsdig.py 文件:

import sys
import socket
import dns.resolver

print 'Argument List:', str(sys.argv)
site = sys.argv[1]
dns_server = sys.argv[2]

# Basic CNAME query the host's DNS
for rdata in dns.resolver.query(site, 'CNAME') :
    print rdata.target

# Basic A query the host's DNS
for rdata in dns.resolver.query(site, 'A') :
    print rdata.address

# Setting an specific DNS Server
resolver = dns.resolver.Resolver()
resolver.nameservers = [socket.gethostbyname(dns_server)]

# Basic CNAME query with the specific DNS server
answer = resolver.query(site, 'CNAME');
for rdata in answer :
    print rdata.target

# Basic A query with the specific DNS server
answer = resolver.query(site, 'A');
for rdata in answer :
    print rdata.address

跑步:

python dnsdig.py www.youtube.com 8.8.8.8
于 2017-02-12T20:41:29.257 回答