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

У меня есть требование, чтобы функция запроса dns запрашивала сервер для разных записей. Я понял, как получить запись MX (большинство примеров показывают это), запись и запись 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 и т.д., но в итоге появились ошибки атрибутов. Каковы ссылки на типы данных, о которых я упоминал ранее?

Ответ 1

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

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

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

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

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

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

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

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

Вот примеры запросов TXT, CNAME и 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)

Ответ 2

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

Вместо того, чтобы каждый раз запрашивать каждый тип записи, вы можете сделать один запрос для ЛЮБОЙ записи. Таким образом, если в этом домене есть TXT, CNAME и т.д., Вы получите один объект со всеми данными.

from dns.resolver import dns
name_server = '8.8.8.8' #Google 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)

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

Ответ 3

С помощью предыдущего ответа создайте файл 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 DNS
for rdata in dns.resolver.query(site, 'CNAME') :
    print rdata.target

# Basic A query the host 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