Pertanyaan Bagaimana saya bisa melakukan pencarian DNS dengan Python, termasuk merujuk ke / etc / hosts?


dnspython akan melakukan pencarian DNS saya dengan sangat baik, tetapi sepenuhnya mengabaikan konten /etc/hosts.

Apakah ada panggilan perpustakaan python yang akan melakukan hal yang benar? yaitu periksa dulu etc/hosts, dan hanya kembali ke DNS lookup sebaliknya?


76
2018-05-10 18:14


asal


Jawaban:


Saya tidak begitu yakin jika Anda ingin melakukan pencarian DNS dirimu sendiri atau jika Anda hanya ingin ip host. Jika Anda menginginkan yang terakhir,

import socket
print socket.gethostbyname('localhost') # result from hosts file
print socket.gethostbyname('google.com') # your os sends out a dns query

82
2018-05-10 18:36



Resolusi nama normal di Python berfungsi dengan baik. Mengapa Anda membutuhkan DNSpython untuk itu. Cukup gunakan stopkontak's getaddrinfo yang mengikuti aturan yang dikonfigurasi untuk sistem operasi Anda (di Debian, itu mengikuti /etc/nsswitch.conf:

>>> print socket.getaddrinfo('google.com', 80)
[(10, 1, 6, '', ('2a00:1450:8006::63', 80, 0, 0)), (10, 2, 17, '', ('2a00:1450:8006::63', 80, 0, 0)), (10, 3, 0, '', ('2a00:1450:8006::63', 80, 0, 0)), (10, 1, 6, '', ('2a00:1450:8006::68', 80, 0, 0)), (10, 2, 17, '', ('2a00:1450:8006::68', 80, 0, 0)), (10, 3, 0, '', ('2a00:1450:8006::68', 80, 0, 0)), (10, 1, 6, '', ('2a00:1450:8006::93', 80, 0, 0)), (10, 2, 17, '', ('2a00:1450:8006::93', 80, 0, 0)), (10, 3, 0, '', ('2a00:1450:8006::93', 80, 0, 0)), (2, 1, 6, '', ('209.85.229.104', 80)), (2, 2, 17, '', ('209.85.229.104', 80)), (2, 3, 0, '', ('209.85.229.104', 80)), (2, 1, 6, '', ('209.85.229.99', 80)), (2, 2, 17, '', ('209.85.229.99', 80)), (2, 3, 0, '', ('209.85.229.99', 80)), (2, 1, 6, '', ('209.85.229.147', 80)), (2, 2, 17, '', ('209.85.229.147', 80)), (2, 3, 0, '', ('209.85.229.147', 80))]

82
2018-05-12 07:44



list( map( lambda x: x[4][0], socket.getaddrinfo( \
     'www.example.com.',22,type=socket.SOCK_STREAM)))

memberi Anda daftar alamat untuk www.example.com. (ipv4 dan ipv6)


0
2018-06-06 18:57



Saya menemukan cara ini untuk memperluas nama host RR DNS yang meluas menjadi daftar IP, ke dalam daftar nama host anggota:

#!/usr/bin/python

def expand_dnsname(dnsname):
    from socket import getaddrinfo
    from dns import reversename, resolver
    namelist = [ ]
    # expand hostname into dict of ip addresses
    iplist = dict()
    for answer in getaddrinfo(dnsname, 80):
        ipa = str(answer[4][0])
        iplist[ipa] = 0
    # run through the list of IP addresses to get hostnames
    for ipaddr in sorted(iplist):
        rev_name = reversename.from_address(ipaddr)
        # run through all the hostnames returned, ignoring the dnsname
        for answer in resolver.query(rev_name, "PTR"):
            name = str(answer)
            if name != dnsname:
                # add it to the list of answers
                namelist.append(name)
                break
    # if no other choice, return the dnsname
    if len(namelist) == 0:
        namelist.append(dnsname)
    # return the sorted namelist
    namelist = sorted(namelist)
    return namelist

namelist = expand_dnsname('google.com.')
for name in namelist:
    print name

Yang, ketika saya menjalankannya, daftar beberapa hostname 1e100.net:


-2
2017-11-07 20:02