модуль python для nslookup

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


person jaysonpryde    schedule 06.09.2012    source источник


Ответы (9)


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

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)})
person PajE    schedule 13.11.2013
comment
Сокет не очень хорошо работает для nslookup, особенно если для всех имен хостов есть несколько доменов. - person Nathan McKaskle; 10.05.2019
comment
Это работает для меня, чтобы получить список IP-адресов в наборе состояний kubernetes. - person Mitchell Tracy; 07.02.2020

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

import dns.resolver

answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
    print 'Host', rdata.exchange, 'has preference', rdata.preference
person Exos    schedule 18.02.2013
comment
Это возвращает только IP, а не полное доменное имя - person Nathan McKaskle; 10.05.2019
comment
dnspython — это утилита для работы с DNS, поэтому /etc/hosts не используется. Для простого прямого поиска DNS лучше использовать socket.gethostbyname() (источник на github dnspython) - person Rafal; 13.06.2020

проблема в том, что 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']
person username    schedule 31.07.2015

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

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

person Sébastien    schedule 31.10.2012

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

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

person Laurent LAPORTE    schedule 18.02.2014
comment
Хотя это верно и тщательно, это ищет имя хоста/полное доменное имя локальной системы. ОП спросил, как искать внешние DNS-имена для очистки сайта. Еще +1 за информацию. - person VooDooNOFX; 04.06.2014
comment
Когда я получаю полные доменные имена, я получаю, возможно, половину серверов с полными полными доменными именами, а остальные — просто имя хоста. ничего. Почему? Nslookup показывает полное доменное имя на этих пустых серверах. - person Nathan McKaskle; 08.05.2019
comment
@NathanMcKaskle, взгляните на свой /etc/hosts: вы можете найти ответ сами. - person Laurent LAPORTE; 09.05.2019
comment
@LaurentLAPORTE у нас есть несколько DNS-доменов и тысячи серверов в разных доменах, я пытаюсь получить полное доменное имя по имени хоста, все возвращается только с именем хоста. Мои хосты выглядят так: 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 Я не знаю, что происходит. - person Nathan McKaskle; 10.05.2019

Мне нужно было отследить записи A в AWS Route 53 с помощью CNames. АКА от messaging.myCompany.com до 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

person Machindo    schedule 09.03.2018
comment
Мы также можем позвонить socket.gethostbyname('google.com'). docs.python.org/2/library/socket.html#socket. gethostbyname - person HarlemSquirrel; 20.08.2018
comment
gethostbyname() не поддерживает разрешение имен IPv6, и вместо этого следует использовать getaddrinfo() для поддержки двойного стека IPv4/v6. - person vchrizz; 21.07.2019

Предыдущие ответы верны, но вот что я бы использовал 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)
person grepit    schedule 03.10.2018

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

import socket
addr1 = socket.gethostbyname('google.com')
addr2 = socket.gethostbyname('yahoo.com')
print(addr1, addr2)
person mh-samiei    schedule 08.06.2019
comment
gethostbyname() не поддерживает разрешение имен IPv6, и вместо этого следует использовать getaddrinfo() для поддержки двойного стека IPv4/v6. - person vchrizz; 21.07.2019

$ sudo apt install python-dns
$ python
>>> import DNS
>>> d = DNS.DnsRequest(server="1.1.1.1", timeout=1)                                       
>>> r = d.req(name="stackoverflow.com", qtype="A")
>>> [i['data'] for i in r.answers]
['151.101.129.69', '151.101.193.69', '151.101.1.69', '151.101.65.69']

Также можно получить доступ к более подробной информации, такой как ttl, плюс этот подход имеет то преимущество, что позволяет вам указать, какой сервер имен использовать, а не просто использовать значение по умолчанию вашей системы.

person Silas S. Brown    schedule 25.03.2020