如何在Windows上使用nslookup和python获取IP地址

时间:2019-10-02 16:05:39

标签: python windows tld nslookup

这些年来,某些功能和命令提供输出的方式发生了一些变化。这就是为什么很难遵循较旧的教程,这些教程有时与软件及其命令的最新版本不符。

当我在Windows上使用nslookuppythonip addresses上查找nslookup google.com时发生了这样的变化,因为我并不主要拥有Mac或Linux。

从2019年起,我们如何才能仅使用python和nslookup来获取“顶级网址”(tld)的IP地址?

3 个答案:

答案 0 :(得分:1)

我查了一下,发现this answer

提供的解决方案是一个很好的起点。根据以上要求,可以对解决方案进行修改以适合上述用例。

如果您在Windows的控制台中使用Non-authoritative answer: Server: UnKnown Address: 192.168.0.1 Name: facebook.com Addresses: 2a03:2880:f12f:183:face:b00c:0:25de 31.13.79.35 ,则会发现类似的输出:

process = subprocess.Popen(["nslookup", url], stdout=subprocess.PIPE)
output = str(process.communicate()[0]).split('\\r\\n')

referenced solution之后,以下两行是我们解决方案的核心:

["b'Server:  UnKnown", 'Address:  192.168.0.1', '', 'Name:    facebook.com', 'Addresses:  2a03:2880:f12f:183:face:b00c:0:25de', '\\t  31.13.79.35', '', "'"]

如果您在控制台中打印输出,您将得到与此类似的结果:

6th element

此列表足以满足上述用例。 接下来要做的是找到一种可靠的方法来始终获得"\\t 31.13.79.35"

6th element

为简化起见,我使用索引切片使用output[5]来获取output[5]

我已经使用不同的URL测试了此代码约10-15次,并且得到了类似的结果。更好的方法是通过迭代输出中的列表项以某种方式检测地址。

同样针对上述用例,使用import subprocess def get_ip_address(url): process = subprocess.Popen( ["nslookup", url], stdout=subprocess.PIPE) output = str(process.communicate()[0]).split('\\r\\n') address = output[5].replace('\\t ', '') return address print(get_ip_address('google.com')) 效果很好。如果有人可以提供更可靠的方法来检测列表中的IP地址,请这样做。

get_ip_address.py

Company A      1001
Company A      1001
Company A      1001
Company B      1002
Company B      1002
Company C      1003

答案 1 :(得分:1)

请勿使用外部工具来满足可以使用适当的库在您的编程语言中完全完成的需求,在您的情况下,该库可以为dnspython

In [2]: import dns

In [3]: import dns.resolver

In [5]: import dns.rdataclass

In [7]: import dns.rdatatype

In [9]: ans = dns.resolver.query('www.example.com', rdtype=dns.rdatatype.A, rdclass=dns.rdataclass.IN)

In [10]: print ans.rrset
www.example.com. 43193 IN A 93.184.216.34

In [12]: print ans.rrset[0]
93.184.216.34

有关更多详细信息,请阅读http://www.dnspython.org/docs/1.16.0/的全功能文档,尤其是输入和输出参数。

两个要点:

  • 不要假设query将永远成功;确保处理错误
  • 不要假设query一定会给您提供预期类型的​​记录,您可能会得到完全不同的东西,因此您必须检查而不是盲目假设。

答案 2 :(得分:-1)

您可能可以使用nmap

节省一些时间。
pip install python-nmap

那么您的python脚本就是:

import nmap

scan = nmap.Portscanner()

scan.scan('127.0.0.1', '21-443') # Returns scan on ports from 21-433 

如果您要扫描某些内容,请谨慎使用代理链,该代理链是使用SOCKS5的基于tor的服务。您可以使用诸如-O -I之类的变体来标识IP地址正在使用的操作系统以及有关打开或关闭哪些套接字的一些信息。

有很多有用的方法,例如:

>>> scan.scaninfo()
{'tcp': {'services': '22-443', 'method': 'connect'}}

>>> scan.all_hosts()
['127.0.0.1']

>>> scan['127.0.0.1'].hostname()
'localhost'

>>> scan['127.0.0.1'].state()
'up'

>>> scan['127.0.0.1'].all_protocols()
['tcp']

>>> scan['127.0.0.1']['tcp'].keys()
[80, 25, 443, 22, 111]

>>> scan['127.0.0.1'].has_tcp(22)
True

>>> scan['127.0.0.1'].has_tcp(23)
False

>>> scan['127.0.0.1']['tcp'][22]
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}

>>> scan['127.0.0.1'].tcp(22)
{'state': 'open', 'reason': 'syn-ack', 'name': 'ssh'}