这些年来,某些功能和命令提供输出的方式发生了一些变化。这就是为什么很难遵循较旧的教程,这些教程有时与软件及其命令的最新版本不符。
当我在Windows上使用nslookup
和python
在ip addresses
上查找nslookup google.com
时发生了这样的变化,因为我并不主要拥有Mac或Linux。
从2019年起,我们如何才能仅使用python和nslookup来获取“顶级网址”(tld)的IP地址?
答案 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'}