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