How do we get TXT, CNAME and SOA records from dnspython?

前端 未结 3 535
暗喜
暗喜 2021-02-04 07:34

I have a requirement to have a dns query function to query a server for various records. I figured out how to get the MX record (most of the examples show this), A record and NS

相关标签:
3条回答
  • 2021-02-04 07:48

    You can try something a bit different.

    Instead of querying each time per record type, you can make a single query for ANY record. This way if that domain has both TXT, CNAME etc... you'll get one object with all the data.

    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)
    

    Hope this might assist you.

    0 讨论(0)
  • 2021-02-04 07:54

    (To answer how you can figure out the returned data)

    You can get the TXT, CNAME, and SOA records a similar way but you just have to get the correct attributes depending on the DNS response object.

    Using the python dir() built-in is your friend and one way to figure out what attributes exist in the DNS response object - handy when API documentation is not available.

    To figure out the appropriate attributes, change your for loop temporarily to the following:

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

    Another and quicker way is to look at the API documentation for dnspython, these pages list the attributes for each returned object.

    Lastly, you could look at the source if the library is in python or if not, then if the C code is available.

    (And to answer your question:)

    Here are examples of TXT, CNAME and SOA queries:

    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 讨论(0)
  • 2021-02-04 08:06

    Exampling with a previous answer, create the dnsdig.py file with:

    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
    

    To run:

    python dnsdig.py www.youtube.com 8.8.8.8
    
    0 讨论(0)
提交回复
热议问题