我需要一个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替换query类型,用data.text、data.data等替换data.address对象,但都以属性错误而告终。我前面提到的数据类型的引用是什么?
发布于 2013-01-06 10:41:35
(回答如何计算返回的数据)
您可以通过类似的方式获取TXT、CNAME和SOA记录,但只需根据DNS响应对象获取正确的属性即可。
使用内置的python dir()是您的朋友,也是确定DNS响应对象中存在哪些属性的一种方法-在API文档不可用时非常方便。
要确定适当的属性,请将for循环临时更改为以下内容:
for data in answer:
print dir(data)
print data另一种更快的方法是查看dnspython的文档,这些页面列出了每个返回对象的属性。
最后,如果库是用python编写的,或者如果不是,那么如果C代码可用,则可以查看源代码。
(回答你的问题:)
以下是TXT、CNAME和查询的示例:
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中文名
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面向服务的体系结构
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)发布于 2014-03-05 21:40:26
你可以尝试一些不同的东西。
您可以对任何记录进行一次查询,而不是每次都按记录类型进行查询。这样,如果该域同时包含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)希望这能对你有所帮助。
发布于 2017-02-13 04:41:29
以前面的答案为例,使用以下命令创建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.8https://stackoverflow.com/questions/13842116
复制相似问题