dnspython wird meine DNS-Suche sehr gut machen, aber den Inhalt von /etc/hosts
vollständig ignorieren.
Gibt es einen python library-Aufruf, der das Richtige tut? Das heißt, checken Sie zuerst etc/hosts
Ein und greifen Sie ansonsten nur auf DNS-Lookups zurück?
Ich bin mir nicht sicher, ob Sie DNS-Lookups durchführen möchten Sie selbst oder ob Sie nur die IP eines Hosts möchten. Falls Sie Letzteres wünschen,
import socket
print(socket.gethostbyname('localhost')) # result from hosts file
print(socket.gethostbyname('google.com')) # your os sends out a dns query
Die normale Namensauflösung in Python funktioniert einwandfrei. Warum benötigen Sie DNSpython dafür? Verwenden Sie einfach socket s getaddrinfo
, das den Regeln folgt, die für konfiguriert wurden Ihr Betriebssystem (unter 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))]
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)
Die Antwort oben war für Python 2 gedacht. Wenn Sie Python 3 verwenden, ist hier der Code.
>>> import socket
>>> print(socket.gethostbyname('google.com'))
8.8.8.8
>>>
Dieser Code eignet sich gut für die Rückgabe aller IP-Adressen, die möglicherweise zu einem bestimmten URI gehören. Da sich viele Systeme jetzt in einer gehosteten Umgebung befinden (AWS/Akamai/etc.), Können Systeme mehrere IP-Adressen zurückgeben. Das Lambda wurde von @Peter Silva "ausgeliehen".
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
if not port:
port = 443
return 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')