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

How to get IP address using nslookup and python on Windows

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

当我使用 nslookuppython 在 windows 上查找 ip addresses 时发生了一个这样的变化,因为我主要没有 mac或 linux.

截至 2019 年,我们如何才能使用 python 和 nslookup 仅获取 'Top Level Url' (tld) 的 IP 地址?

我查找了 SO 并找到了 this answer

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

如果您在 windows 的控制台中使用 nslookup google.com,您会发现类似的输出:

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

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

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

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

["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"

为了使事情更简单,我使用索引切片通过 output[5] 获得 6th element

我已经使用不同的 url 对该代码进行了大约 10-15 次测试,并且得到了相似的结果。更好的方法是通过遍历输出中的列表项以某种方式检测地址。

同样对于上述用例,使用 output[5] 效果很好。如果有人可以提供更可靠的方法来检测列表中的 ip 地址,请这样做。

get_ip_address.py

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

您可能可以使用 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 

如果你正在扫描你想要小心的东西,请考虑使用 proxychains,这是一个使用 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'}

不要使用外部工具来满足可以使用适当的库在您的编程语言中完全完成的需求,在您的情况下可以是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一定会返回你期望类型的记录,你可能会得到完全不同的东西,所以你要检查而不是盲目假设。