Модуль python для nslookup - программирование
Подтвердить что ты не робот

Модуль python для nslookup

Есть ли python-модуль, который делает то же самое, что и nslookup? Я планирую использовать nslookup для выкапывания некоторой информации о домене URL-адреса, подлежащего отказу. Я знаю, что я могу использовать os.sys для вызова nslookup, но мне просто интересно, есть ли для этого уже python-модуль. Спасибо заранее!

4b9b3361

Ответ 1

Я использую следующий код:

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)})

Ответ 2

Вам нужно использовать DNSPython

import dns.resolver

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

Ответ 3

Вы должны использовать библиотеку сокетов http://docs.python.org/2/library/socket.html

Вызов системной функции в этом случае не является хорошей практикой.

Ответ 4

проблема в том, что socket.gethostbyname() возвращает только один 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']

Ответ 5

Обратите внимание, что 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

Oooops! Чтобы решить эту проблему, я знаю единственное решение - изменить /etc/hosts следующим образом:

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

Надеюсь, поможет!

Ответ 6

Мне нужно было отслеживать записи A в AWS Route 53 с использованием CNames. AKA messaging.myCompany.com to moreSpecificMessaging.myCompanyInternal.com

Я также использую Socket, но другой довольно скрытый метод.

import socket

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

print(addr1)

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

Ответ 7

Предыдущие ответы верны, но я бы использовал сокет, который "обеспечивает доступ к интерфейсу сокета 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)

Ответ 8

Если nslookup или dig не установлены в системе, я использую следующее для интерактивного использования, вывод nslookup-friendly dns lookup

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)

Ответ 9

Я использую следующий код:

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