【问题标题】:How to get IP address using nslookup and python on Windows如何在 Windows 上使用 nslookup 和 python 获取 IP 地址
【发布时间】:2020-01-31 22:54:35
【问题描述】:

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

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

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

【问题讨论】:

  • 您的意思是如何解析主机名? TLD 本身没有 IP 地址。你能举出输入和预期输出的例子吗?
  • 当您的编程语言拥有执行相同操作所需的所有库时,请勿执行外部命令。请参阅dnspython 库。这就是为什么,关于“某些功能和命令提供输出的方式发生了一些变化”。您应该停止尝试解析从未预期会被解析的外部命令,并使用适当的功能来获得您需要的结果。

标签: python windows tld nslookup


【解决方案1】:

我查了一下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"

为了让事情更简单,我使用索引切片来获取6th element,使用output[5]

我已经使用不同的 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'))

【讨论】:

  • 当您的编程语言拥有执行相同操作所需的所有库时,请勿执行外部命令。请参阅dnspython 库。解析从未设计为解析的命令的文本结果很脆弱。
【解决方案2】:

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

【讨论】:

  • 使用 nmap 和将名称解析为 IP 地址是完全不相关的两件事。
  • nmap 是一个连接主机并发现哪些端口是开放的(除其他外)的工具。 nslookup 是一种执行 DNS 查询的工具,通常将名称映射到 IP 地址。它们在概念上是完全不同的东西。
  • 因为您忽略 TLD 没有 IP 地址这一事实比试图揭穿更简单的方法来解决 OP 打算意味着什么的问题
  • 您的解决方案有点误导。东西在windows上,除非你安装nmap并将其添加到路径中,否则nmap.PortScanner()命令不起作用。
  • " TLD 没有 IP 地址 " 这是错误的。 .DK 有一个 IP 地址。而且它不是唯一的。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2021-01-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-26
    • 2021-05-22
    相关资源
    最近更新 更多