¿Cómo obtenemos registros TXT, CNAME y SOA de dnspython?

Tengo el requisito de tener una función de consulta dns para consultar varios registros en un servidor. Descubrí cómo obtener el registro MX (la mayoría de los ejemplos muestran esto), un registro A y un registro NS. ¿Cómo obtengo los registros TXT, CNAME y SOA?

Fragmento de código de muestra:

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

Intenté reemplazar el tipo de consulta con TXT y el objeto data.address con data.text, data.data, etc., pero terminé con errores de atributos. ¿Cuáles son las referencias para los tipos de datos que mencioné anteriormente?

(Para responder cómo puedes averiguar los datos devueltos)

Puede obtener los registros TXT, CNAME y SOA de una manera similar, pero solo tiene que obtener los atributos correctos en función del objeto de respuesta del DNS.

El uso de python dir () integrado es su amigo y una forma de averiguar qué atributos existen en el objeto de respuesta DNS: útil cuando la documentación de la API no está disponible.

Para averiguar los atributos apropiados, cambie su bucle for temporalmente a lo siguiente:

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

Otra forma más rápida es mirar la documentación de la API para dnspython , estas páginas enumeran los atributos para cada objeto devuelto.

Por último, puede mirar la fuente si la biblioteca está en python o, si no, si el código C está disponible.

(Y para responder a tu pregunta:)

Aquí hay ejemplos de consultas TXT, CNAME y 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) 

Puedes probar algo un poco diferente.

En lugar de consultar cada vez por tipo de registro, puede realizar una única consulta para CUALQUIER registro. De esta manera, si ese dominio tiene TXT, CNAME, etc., obtendrá un objeto con todos los datos.

 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) 

Espero que esto pueda ayudarte.

Examinando una respuesta anterior, cree el archivo dnsdig.py con:

 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 

Correr:

 python dnsdig.py www.youtube.com 8.8.8.8