2012-12-12 10 views
10

Ho un requisito per avere una funzione di query DNS per interrogare un server per vari record. Ho capito come ottenere il record MX (la maggior parte degli esempi lo mostrano), un record e un record NS. Come posso ottenere i record TXT, CNAME e SOA? codiceCome otteniamo i record TXT, CNAME e SOA da dnspython?

Esempio frammento:

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

Ho provato a sostituire il tipo di query con TXT e l'oggetto data.address con data.text, data.data ecc, ma finito con errori di attributo. Quali sono i riferimenti per i tipi di dati che ho citato prima?

risposta

16

(Per rispondere a come si può capire i dati restituiti)

È possibile ottenere il TXT, CNAME, e SOA registra un modo simile ma è sufficiente per ottenere gli attributi corretti a seconda dell'oggetto risposta DNS.

L'uso del python dir() built-in è tuo amico e un modo per capire quali attributi esistono nell'oggetto di risposta DNS: utile quando la documentazione API non è disponibile.

di capire gli attributi appropriati, cambiare il vostro ciclo for temporaneamente al seguente:

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

altro e il modo più veloce è quello di esaminare la documentazione API per dnspython, elencano queste pagine gli attributi per ciascun oggetto restituito.

Infine, è possibile controllare l'origine se la libreria è in python o, in caso contrario, se il codice C è disponibile.

(E per rispondere alla tua domanda :)

Ecco alcuni esempi di TXT, CNAME e query 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) 
+0

collegamenti sono rotti ... –

+1

deve essere fissato ora –

7

Si può provare qualcosa di un po 'diverso.

Invece di interrogare ogni volta per tipo di record, è possibile creare una singola query per QUALSIASI record. In questo modo se quel dominio ha sia TXT, CNAME ecc ... otterrai un oggetto con tutti i dati.

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) 

Spero che questo possa aiutarti.

+0

Perché si specifica 'ADDITIONAL_RDCLASS = 65535' Ho guardato e non riesce a trovare molto per quello che fa. – Nathaniel

0

Esaminando con una risposta precedente, creare il dnsdig.il file 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 

Per eseguire:

python dnsdig.py www.youtube.com 8.8.8.8 
Problemi correlati