Frage Wie kann ich DNS-Lookups in Python machen, einschließlich der Bezugnahme auf / etc / hosts?


dnspython wird meine DNS-Lookups sehr schön machen, aber es ignoriert völlig den Inhalt von /etc/hosts.

Gibt es einen Python-Bibliotheksaufruf, der das Richtige tut? dh zuerst einchecken etc/hostsund nur auf DNS-Lookups zurückgreifen, sonst?


76
2018-05-10 18:14


Ursprung


Antworten:


Ich bin mir nicht sicher, ob Sie DNS-Lookups machen wollen dich selber oder wenn du nur die IP eines Hosts willst. Falls Sie das letztere wollen,

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



Die normale Namensauflösung in Python funktioniert gut. Warum brauchen Sie DNSpython dafür? Benutz einfach Steckdoseist es getaddrinfo das folgt den Regeln, die für Ihr Betriebssystem konfiguriert sind (auf Debian folgt es /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)))

gibt Ihnen eine Liste der Adressen für www.example.com. (ipv4 und ipv6)


0
2018-06-06 18:57



Ich habe diesen Weg gefunden, um einen DNS-RR-Hostnamen, der in eine Liste von IPs expandiert, in die Liste der Mitglieds-Hostnamen zu erweitern:

#!/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

Wenn ich es ausführe, listet es einige 1e100.net-Hostnamen auf:


-2
2017-11-07 20:02