Soru / Etc / hosts adresine atıfta bulunmak da dahil olmak üzere, Python'da DNS aramalarını nasıl yapabilirim?


dnspython DNS aramalarımı çok güzel yapacak, ancak içeriği tamamen yok sayar /etc/hosts.

Doğru şeyi yapacak bir python kütüphanesi var mı? yani ilk kontrol et etc/hostsve sadece aksi halde DNS aramalarına geri dönüyor musunuz?


76
2018-05-10 18:14


Menşei


Bunun için bir sorun yarattım: github.com/rthalley/dnspython/issues/149 - Greg Dubicki
dnspython bunu uygulamaz. Basit ileriye doğru aramalar için önerilenleri kullanın socket.gethostbynameDaha karmaşık sorgular için dnspython'u kullanın. - sebix


Cevaplar:


DNS aramaları yapmak isteyip istemediğinizden emin değilim. kendin ya da sadece bir ev sahibinin ipini istiyorsan. Eğer ikincisini istiyorsan,

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



Aslında. Bortzmeyer'ın kodu IPv4 ve IPv6 yeteneğidir. - fmark
Bu arama hangi düzeyde önbelleğe alınıyor bilen var mı? Python içinde mi? Ya da OS? Ya da DNS sunucusu? - Simon East
@Simon Python veya işletim sistemi tarafından önbelleğe alınmadı. Önbelleklenip önlenemediği herhangi bir DNS sunucusuna bağlıdır. - Genel olarak konuşmak gerekirse: DNS, yalnızca uygulamanın kendisi tarafından veya çözümleme zincirinde bulunan DNS-sunucularını çözümleyerek önbelleğe alınır. - Robert Siemer
@Jochen “localhost” ana bilgisayar dosyasından geliyorsa veya yapılandırmaya bağlı değilse! - Robert Siemer
@RobertSiemer Geç yorum için üzgünüm: sonuç Mayıs ayı yerel çözümleyici tarafından önbelleğe alınabilir. nscd ve nslcd Unix kutularında bunu yapabilirsiniz. Önbelleğe alma için yapılandırılmış bir yerel ad sunucusu tarafından da önbelleğe alınabilir (bir zamanlar ortak bir kurulum. Muhtemelen şimdi çok fazla değil). Maalesef basit bir “hayır” cevabı değil. Bu şeyler nadiren vardır. :) - Alexios


Python'daki normal isim çözünürlüğü iyi çalışıyor. Bunun için neden DNSpython'a ihtiyacınız var? Sadece kullan priz'ler getaddrinfo İşletim sisteminiz için yapılandırılmış kuralları izler (Debian’da /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



Dönüşüm adımını eklemek güzel olurdu. addrs = [ str(i[4][0]) for i in socket.getaddrinfo(name, 80) ] bana ips listesini verir. - Alex


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

Size www.example.com adreslerinin bir listesini verir. (ipv4 ve ipv6)


0
2018-06-06 18:57





IP'ler listesine genişleyen bir DNS RR ana bilgisayar adını üye ana makine adları listesine genişletmek için bu yolu buldum:

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

Hangi, çalıştırdığımda, birkaç tane 1e100.net hostnamesini listeler:


-2
2017-11-07 20:02