2012-12-12 12 views
10

Mam wymóg posiadania funkcji zapytania dns do zapytania serwera o różne rekordy. Wymyśliłem, jak uzyskać rekord MX (większość tego pokazuje), rekord A i rekord NS. Jak uzyskać rekordy TXT, CNAME i SOA? KodW jaki sposób otrzymujemy rekordy TXT, CNAME i SOA z dnspython?

przykładowy fragment:

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

Próbowałem zastępując typ zapytania z TXT i obiektu data.address z data.text, data.data etc, ale skończyło się z błędami atrybutów. Jakie są odniesienia do typów danych, o których wspomniałem wcześniej?

Odpowiedz

16

(Aby odpowiedzieć, jak można dowiedzieć się zwracanych danych)

można uzyskać TXT, CNAME i SOA rejestruje podobny sposób, ale po prostu trzeba uzyskać odpowiednie atrybuty w zależności od obiektu odpowiedzi DNS.

Wbudowana funkcja python dir() jest Twoim przyjacielem i jednym ze sposobów ustalenia, jakie atrybuty istnieją w obiekcie odpowiedzi DNS - przydatne, gdy dokumentacja API jest niedostępna.

Aby dowiedzieć się odpowiednie atrybuty, zmień pętli tymczasowo na następujące kwestie:

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

Innym i szybszym sposobem jest przyjrzenie się dokumentacji API dla dnspython tych stronach przedstawiono atrybuty dla każdego zwrócony obiekt.

Wreszcie, możesz sprawdzić źródło, jeśli biblioteka jest w python, a jeśli nie, to jeśli kod C jest dostępny.

(I odpowiedzieć na pytanie :)

Oto przykłady TXT, CNAME i zapytania 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

Linki są podzielone ... –

+1

należy ustalić teraz –

7

Można spróbować czegoś trochę innego.

Zamiast wpisywać za każdym razem dla każdego typu rekordu, można wykonać pojedyncze zapytanie dla dowolnego rekordu. W ten sposób, jeśli domena ma zarówno TXT, CNAME itp. ... otrzymasz jeden obiekt ze wszystkimi danymi.

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) 

Mam nadzieję, że to może ci pomóc.

+0

Dlaczego określić 'ADDITIONAL_RDCLASS = 65535' szukałem i nie mogę znaleźć co do tego. – Nathaniel

0

Próbując z poprzednią odpowiedzią, utwórz dnsdig.Plik py z:

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 

Aby uruchomić:

python dnsdig.py www.youtube.com 8.8.8.8 
Powiązane problemy