用于 nslookup 的 python 模块

问题描述 投票:0回答:9

是否有一个 python 模块可以做与 nslookup 相同的事情? 我计划使用 nslookup 来挖掘一些有关要废弃的 URL 域的信息。我知道我可以使用 os.sys 来调用 nslookup 但我只是想知道是否已经有一个 python 模块。 预先感谢!

python-module nslookup
9个回答
53
投票

使用以下代码:

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

19
投票

您需要使用DNSPython

import dns.resolver

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

15
投票

问题是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']

9
投票

您应该使用套接字库http://docs.python.org/2/library/socket.html

在这种情况下,系统函数调用不是一个好的做法。


7
投票

请注意,

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

希望有帮助!


7
投票

我需要使用 CName 追踪 AWS Route 53 中的 A 记录。又名

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


2
投票

以前的答案是正确的,但这里是我要使用的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)

2
投票

我正在使用以下代码:

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

1
投票
$ 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 等更多详细信息,而且这种方法的优点是可以让您指定要使用的名称服务器,而不仅仅是使用系统的默认名称服务器。

© www.soinside.com 2019 - 2024. All rights reserved.