2010-05-10 2 views
72

dnspython fera très bien mes recherches DNS, mais il ignore entièrement le contenu de /etc/hosts.Comment effectuer des recherches DNS en Python, y compris en faisant référence à/etc/hosts?

Y at-il un appel de bibliothèque Python qui fera le bon choix? c.-à-d. vérifier d'abord dans etc/hosts, et revenir uniquement aux recherches DNS autrement?

+0

J'ai créé un problème pour cela: https://github.com/rthalley/dnspython/issues/149 –

+0

dnspython ne l'implémentera pas. Pour les recherches directes simples, utilisez le 'socket.gethostbyname' proposé, pour des requêtes plus complexes, utilisez dnspython. – sebix

Répondre

78

Je ne suis pas vraiment sûr si vous voulez faire des recherches DNS vous-même ou si vous voulez juste l'IP d'un hôte. Dans le cas où vous voulez que ce dernier,

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

En effet. Le code de Bortzmeyer est compatible IPv4 et IPv6. – fmark

+0

Est-ce que quelqu'un sait à quel niveau cette recherche est mise en cache? Au sein de Python? Ou OS? Ou un serveur DNS? –

+0

@ Simon Non mis en cache par Python, ni le système d'exploitation. Cela dépend de n'importe quel serveur DNS impliqué s'il cache ou non. - De manière générale: le DNS n'est mis en cache que par l'application elle-même, ou en résolvant des serveurs DNS placés dans la chaîne de résolution. –

76

La résolution de nom normale en Python fonctionne très bien. Pourquoi avez-vous besoin de DNSpython pour ça? Il suffit d'utiliser l » getaddrinfosocket qui suit les règles configurées pour votre système d'exploitation (sur Debian, il suit /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))] 
+3

serait bien d'ajouter l'étape de transformation. 'addrs = [str (i [4] [0]) pour i dans socket.getaddrinfo (nom, 80)]' me donne la liste des ips. – Alex

-2

J'ai trouvé ce moyen de développer un nom d'hôte DNS RR qui se développe dans une liste d'adresses IP, dans la liste des noms d'hôtes membres:

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

qui, quand je le lance, énumère quelques 1e100.net noms de domaine:

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

vous donne une liste des adresses pour www.example.com. (ipv4 et ipv6)

Questions connexes