web-dev-qa-db-ja.com

python nslookupのモジュール

Nslookupと同じことをしているpythonモジュールはありますか? nslookupを使用して、廃棄するURLのドメインに関する情報を掘り下げる予定です。 os.sysを使用してnslookupを呼び出すことができることは知っていますが、このためのpython-moduleが既にあるのかどうか疑問に思っています。前もって感謝します!

23
jaysonpryde

私は次のコードを使用しています:

import socket

ip_list = []
ais = socket.getaddrinfo("www.yahoo.com",0,0,0,0)
for result in ais:
  ip_list.append(result[-1][0])
ip_list = list(set(ip_list))

または、理解度を次のように使用します。

ip_list = list({addr[-1][0] for addr in socket.getaddrinfo(name, 0, 0, 0, 0)})
22
PajE

DNSPython を使用する必要があります

import dns.resolver

answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
    print 'Host', rdata.exchange, 'has preference', rdata.preference
15
Exos

ソケットライブラリを使用する必要があります http://docs.python.org/2/library/socket.html

この場合、システム関数呼び出しはお勧めできません。

9
Sébastien

問題は、socket.gethostbyname()が1つのIPアドレスしか返さないことです。 nslookupは、できるだけ多くを返します。私が使う:

import subprocess

process = subprocess.Popen(["nslookup", "www.google.com"], stdout=subprocess.PIPE)
output = process.communicate()[0].split('\n')

ip_arr = []
for data in output:
    if 'Address' in data:
        ip_arr.append(data.replace('Address: ',''))
ip_arr.pop(0)

print ip_arr

印刷されます:

['54.230.228.101', '54.230.228.6', '54.230.228.37', '54.230.228.80', '54.230.228.41', '54.230.228.114', '54.230.228.54', '54.230.228.23']
6
username

socket.getfqdn()はホスト名の完全修飾名を返すことができることに注意してください。参照: http://docs.python.org/2/library/socket.html?highlight=socket.getaddrinfo#socket.getfqdn

例えば:

_python -c  'import socket; print(socket.gethostname()); print(socket.getfqdn());'
myserver
myserver.mydomain.local
_

ただし、結果は_/etc/hosts_構成に依存します。あなたが持っている場合:

_$ cat /etc/hosts
127.0.0.1       myserver  localhost.localdomain  localhost
_

socket.getfqdn()の結果は次のようになります。

_python -c  'import socket; print(socket.getfqdn());'
localhost.localdomain
_

おっと!それを解決するための唯一の解決策は、次のように_/etc/hosts_を変更することです。

_$ cat /etc/hosts
127.0.0.1       myserver  myserver.mydomain.local  localhost.localdomain  localhost
_

それが役に立てば幸い!

5
Laurent LAPORTE

CNamesを使用してAWS Route 53のAレコードを追跡する必要がありました。別名messaging.myCompany.comからmoreSpecificMessaging.myCompanyInternal.com

Socketも使用しますが、もう1つの隠された方法です。

import socket

addr1 = socket.gethostbyname_ex('google.com')

print(addr1)

https://docs.python.org/3/library/socket.html#socket.gethostbyname_ex

4
Machindo

以前の回答は正しいですが、ここに私が使用するものがあります socket 、「BSDソケットインターフェイスへのアクセスを提供します。最新のすべてのUnixシステム、Windows、MacOS、おそらく追加のプラットフォームで利用可能です」

import socket

distinct_ips = []
# 0,0,0,0  is for (family, type, proto, canonname, sockaddr)
#change some_site.com to whatever your are looking up of course
socket_info = socket.getaddrinfo("some_site.com",0,0,0,0)
for result in socket_info:
    ns_ip = result[4][0]
    if distinct_ips.count(ns_ip)==0:
        distinct_ips.append(ns_ip)
        print(ns_ip)
1
grepit

NslookupまたはDigがシステムにインストールされていない場合、インタラクティブな使用のために、nslookupに適したdnsルックアップ出力を使用します

import socket,argparse

def main(args):
    fqdn = args.fqdn
    try:
        ip_addr = socket.gethostbyname(fqdn)
        server_info()
        print 'Name: ' + fqdn
        print 'Address: ' + ip_addr
    except socket.gaierror:
        server_info()
        print "** server can't find {0}: NXDOMAIN".format(fqdn)

def server_info():
    lines = [line.rstrip('\n') for line in open('/etc/resolv.conf')]
    for line in lines:
        if line.startswith('nameserver'):
            print 'Server:\t\t' + line.split()[1]
            print 'Address:\t' + line.split()[1] + '#53\n'
            break

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Python nslookup utility')
    parser.add_argument('fqdn', type=str, help='Fully qualified domain name')
    args = parser.parse_args()
    main(args)
0
lainatnavi

私は次のコードを使用しています:

import socket
addr1 = socket.gethostbyname('google.com')
addr2 = socket.gethostbyname('yahoo.com')
print(addr1, addr2)
0
zaza