web-dev-qa-db-ja.com

/ etc / hostsを参照するなど、PythonでDNSルックアップを実行するにはどうすればよいですか?

dnspython はDNSルックアップを非常にうまく行いますが、/etc/hostsの内容を完全に無視します。

正しいことを行うpythonライブラリ呼び出しはありますか?すなわち、最初にetc/hostsをチェックし、それ以外の場合はDNSルックアップのみにフォールバックしますか?

84
Toby White

DNSルックアップを行うかどうかyourselfか、ホストのIPだけが必要かどうかはわかりません。後者が必要な場合は、

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

Pythonの通常の名前解決は正常に機能します。なぜDNSpythonが必要なのですか。 socketgetaddrinfoを使用してください。これは、オペレーティングシステム用に設定されたルールに従います(Debianでは、/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))]
86
bortzmeyer
list( map( lambda x: x[4][0], socket.getaddrinfo( \
     'www.example.com.',22,type=socket.SOCK_STREAM)))

www.example.comのアドレスのリストが表示されます。 (ipv4およびipv6)

2
Peter Silva

上記の答えはPython 2を対象としています。Python 3を使用している場合、次のコードを使用します。

>>> import socket
>>> print(socket.gethostbyname('google.com'))
8.8.8.8
>>>
0
Sabrina

このコードは、特定のURIに属する可能性のあるすべてのIPアドレスを返すのに適しています。現在、多くのシステムがホスト環境(AWS/Akamai /など)にあるため、システムはいくつかのIPアドレスを返す場合があります。ラムダは@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

    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')
0
PythonNoob