Как мы можем получить записи TXT, CNAME и SOA из dnspython?

У меня есть требование иметь функцию запроса 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.address - data.text, data.data и т. Д., Но в результате возникли ошибки атрибутов. Каковы ссылки на типы данных, которые я упоминал ранее?

3 ответа

(Чтобы ответить, как вы можете выяснить, возвращенные данные)

Вы можете получить записи TXT, CNAME и SOA аналогичным образом, но вам просто нужно получить правильные атрибуты в зависимости от объекта ответа DNS.

Использование встроенного в python dir() - ваш друг, и один из способов выяснить, какие атрибуты существуют в объекте ответа DNS - удобно, когда документация API недоступна.

Чтобы выяснить соответствующие атрибуты, временно измените цикл for на следующий:

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

Другой и более быстрый способ - посмотреть документацию по API для dnspython, на этих страницах перечислены атрибуты для каждого возвращаемого объекта.

Наконец, вы можете посмотреть на исходный код, если библиотека находится в python или, если нет, то если код на C доступен.

(И ответить на ваш вопрос:)

Вот примеры запросов TXT, CNAME и SOA:

текст

http://www.dnspython.org/docs/1.15.0/dns.rdtypes.txtbase.TXTBase-class.html

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

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)

Вы можете попробовать что-то немного другое.

Вместо того, чтобы запрашивать каждый раз для каждого типа записи, вы можете сделать один запрос для ЛЮБОЙ записи. Таким образом, если в этом домене есть 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)

Надеюсь, это поможет вам.

На примере предыдущего ответа создайте файл 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
Другие вопросы по тегам