Как мы получаем записи 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 и т. Д., Но закончил с ошибками атрибутов. Каковы ссылки на типы данных, о которых я упоминал ранее?

    3 Solutions collect form web for “Как мы получаем записи TXT, CNAME и SOA из dnspython?”

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

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

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

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

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

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

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

    ТЕКСТ

    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) 

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

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