Alguém sabe em que nível esta pesquisa é armazenada em cache? Dentro do Python? Ou sistema operacional? Ou servidor DNS?
Simon East
@Simon Não armazenado em cache pelo Python, nem pelo sistema operacional. Depende de qualquer servidor DNS envolvido se ele armazena em cache ou não. - De um modo geral: o DNS é armazenado em cache apenas pelo próprio aplicativo ou resolvendo-DNS-servidores dobrados na cadeia de resolução.
Robert Siemer
@Jochen se “localhost” vem do arquivo hosts ou não depende da configuração!
Robert Siemer
@RobertSiemer Desculpe pelo comentário tardio: o resultado pode ser armazenado em cache pelo resolvedor local. nscde nslcdem caixas Unix pode fazer isso. Ele também pode ser armazenado em cache por um servidor de nomes local configurado para armazenamento em cache (uma configuração comum, uma vez. Provavelmente não tanto agora). Infelizmente, não é uma resposta direta "não". Essas coisas raramente são. :)
Alexios
isso sempre retornará um único endereço, não? Portanto, se você tiver um round robin de dns, isso não exibirá todos os endereços associados ao nome do host.
ThorSummoner
90
A resolução de nome normal em Python funciona bem. Por que você precisa do DNSpython para isso. Basta usar soquete , getaddrinfoque segue as regras configuradas para seu sistema operacional (no Debian, segue /etc/nsswitch.conf:
Este código funciona bem para retornar todos os endereços IP que podem pertencer a um determinado URI. Como muitos sistemas agora estão em um ambiente hospedado (AWS / Akamai / etc.), Os sistemas podem retornar vários endereços IP. O lambda foi "emprestado" de @Peter Silva.
def get_ips_by_dns_lookup(target, port=None):'''
this function takes the passed target and optional port and does a dns
lookup. it returns the ips that it finds to the caller.
:param target: the URI that you'd like to get the ip address(es) for
:type target: string
:param port: which port do you want to do the lookup against?
:type port: integer
:returns ips: all of the discovered ips for the target
:rtype ips: list of strings
'''import socket
ifnot port:
port =443return list(map(lambda x: x[4][0], socket.getaddrinfo('{}.'.format(target),port,type=socket.SOCK_STREAM)))
ips = get_ips_by_dns_lookup(target='google.com')
Descobri essa maneira de expandir um nome de host DNS RR que se expande em uma lista de IPs, na lista de nomes de host de membros:
#!/usr/bin/pythondef 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 hostnamesfor ipaddr in sorted(iplist):
rev_name = reversename.from_address(ipaddr)# run through all the hostnames returned, ignoring the dnsnamefor 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 dnsnameif 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
Que, quando eu executo, lista alguns nomes de host 1e100.net:
socket.gethostbyname
diretas simples, use o proposto ; para consultas mais complexas, use dnspython.Respostas:
Não tenho certeza se você deseja fazer pesquisas de DNS sozinho ou se apenas deseja o ip de um host. Caso você queira o último,
fonte
nscd
enslcd
em caixas Unix pode fazer isso. Ele também pode ser armazenado em cache por um servidor de nomes local configurado para armazenamento em cache (uma configuração comum, uma vez. Provavelmente não tanto agora). Infelizmente, não é uma resposta direta "não". Essas coisas raramente são. :)A resolução de nome normal em Python funciona bem. Por que você precisa do DNSpython para isso. Basta usar soquete ,
getaddrinfo
que segue as regras configuradas para seu sistema operacional (no Debian, segue/etc/nsswitch.conf
:fonte
addrs = [ str(i[4][0]) for i in socket.getaddrinfo(name, 80) ]
me dá a lista de ips.fornece uma lista dos endereços de www.example.com. (ipv4 e ipv6)
fonte
Este código funciona bem para retornar todos os endereços IP que podem pertencer a um determinado URI. Como muitos sistemas agora estão em um ambiente hospedado (AWS / Akamai / etc.), Os sistemas podem retornar vários endereços IP. O lambda foi "emprestado" de @Peter Silva.
fonte
A resposta acima foi destinada ao Python 2. Se você estiver usando o Python 3, aqui está o código.
fonte
Descobri essa maneira de expandir um nome de host DNS RR que se expande em uma lista de IPs, na lista de nomes de host de membros:
Que, quando eu executo, lista alguns nomes de host 1e100.net:
fonte