【发布时间】:2012-08-31 02:54:18
【问题描述】:
是否有一个 python 模块与 nslookup 做同样的事情? 我计划使用 nslookup 来挖掘有关要报废的 URL 域的一些信息。我知道我可以使用 os.sys 来调用 nslookup 但我只是想知道是否已经有一个 python 模块。 提前致谢!
【问题讨论】:
是否有一个 python 模块与 nslookup 做同样的事情? 我计划使用 nslookup 来挖掘有关要报废的 URL 域的一些信息。我知道我可以使用 os.sys 来调用 nslookup 但我只是想知道是否已经有一个 python 模块。 提前致谢!
【问题讨论】:
我正在使用以下代码:
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)})
【讨论】:
你需要使用DNSPython
import dns.resolver
answers = dns.resolver.query('dnspython.org', 'MX')
for rdata in answers:
print 'Host', rdata.exchange, 'has preference', rdata.preference
【讨论】:
问题是 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']
【讨论】:
你应该使用套接字库http://docs.python.org/2/library/socket.html
在这种情况下,系统函数调用不是一个好习惯。
【讨论】:
请注意,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
希望对你有帮助!
【讨论】:
/etc/hosts:你可能会自己找到答案。
我需要使用 CNames 在 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
【讨论】:
socket.gethostbyname('google.com')。 docs.python.org/2/library/socket.html#socket.gethostbyname
以前的答案是正确的,但这是我将使用的 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)
【讨论】:
我正在使用以下代码:
import socket
addr1 = socket.gethostbyname('google.com')
addr2 = socket.gethostbyname('yahoo.com')
print(addr1, addr2)
【讨论】:
$ 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 等更多详细信息,此外,这种方法的优点是可以让您指定要使用的名称服务器,而不仅仅是使用系统的默认值。
【讨论】: