Pytanie Jak mogę wykonywać wyszukiwania DNS w Pythonie, w tym odnosząc się do / etc / hosts?


dnspython zrobi moje DNS bardzo ładnie, ale całkowicie ignoruje zawartość /etc/hosts.

Czy istnieje wywołanie biblioteki Pythona, które zrobi to, co trzeba? tj. najpierw sprawdź etc/hostsi tylko wracają do wyszukiwań DNS w inny sposób?


76
2018-05-10 18:14


pochodzenie


Stworzyłem dla tego problem: github.com/rthalley/dnspython/issues/149 - Greg Dubicki
dnspython nie wdroży tego. Aby uzyskać proste wyszukiwania do przodu, użyj proponowanego socket.gethostbyname, dla bardziej złożonych zapytań, użyj dnspython. - sebix


Odpowiedzi:


Nie jestem do końca pewien, czy chcesz wyszukiwać DNS siebie lub jeśli chcesz tylko IP hosta. Jeśli chcesz ten drugi,

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



W rzeczy samej. Kod Bortzmeyera obsługuje IPv4 i IPv6. - fmark
Czy ktoś wie, na jakim poziomie jest buforowane to wyszukiwanie? W Pythonie? Lub OS? Lub serwer DNS? - Simon East
@Simon Nie buforowany przez Python ani system operacyjny. Zależy od dowolnego serwera DNS, jeśli jest on buforowany, czy nie. - Ogólnie rzecz biorąc: DNS jest buforowany tylko przez samą aplikację lub przez rozróżnianie serwerów DNS schowanych w łańcuchu rozstrzygającym. - Robert Siemer
@Jochen, jeśli "localhost" pochodzi z pliku hosts, zależy od konfiguracji! - Robert Siemer
@RobertSiemer Przepraszamy za spóźniony komentarz: wynik może być buforowane przez lokalnego tłumacza. nscd i nslcd na Uniksowych skrzynkach może to zrobić. Może również zostać zbuforowany przez lokalny serwer nazw skonfigurowany do buforowania (typowa konfiguracja, raz na jakiś czas. Prawdopodobnie nie tak wiele teraz). Niestety, nie jest to prosta odpowiedź "nie". Te rzeczy rzadko się zdarzają. :) - Alexios


Normalne rozwiązywanie nazw w Pythonie działa dobrze. Dlaczego do tego potrzebujesz DNSpython? Po prostu użyj gniazdo elektryczne„s getaddrinfo który jest zgodny z regułami skonfigurowanymi dla twojego systemu operacyjnego (w Debianie, to następuje /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



Byłoby miło dodać krok transformacji. addrs = [ str(i[4][0]) for i in socket.getaddrinfo(name, 80) ] daje mi listę ips. - Alex


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

podaje listę adresów dla www.example.com. (ipv4 i ipv6)


0
2018-06-06 18:57





Znalazłem w ten sposób rozwinięcie nazwy hosta DNS RR, która rozwija się na listę adresów IP, na listę nazw hostów członków:

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

Które po uruchomieniu wymienia kilka nazw hostów 1e100.net:


-2
2017-11-07 20:02