我找不到仅使用
scapy
(而不是 Python 的 stdlib)来查找本地 IP 地址的方法。
我发现的唯一解决方法是发送一个虚拟包并使用它从源字段检索地址,但我不认为这是一个好的解决方案。
如果您查看https://scapy.readthedocs.io/en/latest/routing.html#get-local-ip-ip-of-an-interface 您可以使用
获取任何接口的本地IP>>> ip = get_if_addr(conf.iface) # default interface
>>> ip = get_if_addr("eth0")
>>> ip
'10.0.0.5'
快速提醒:您可能有多个 IP 地址。您拥有的每个接口都有一个。要获取 scapy 当前工作接口的 IP 地址,您应该按照 Cukic0d 在评论中的建议执行
get_if_addr(conf.iface)
操作。
这里有一个在windows和linux下都可以工作的方法。这将为您提供所有接口的 IP 地址。
在 scapy shell 中工作
>>> s = set() # there will be redundencies so we'll use set to remove them
>>> for line in read_routes():
...: s.add(line[4])
...:
>>> s
{'10.0.0.4',
'169.254.106.110',
'169.254.17.51',
'169.254.177.137',
'192.168.56.1',
'192.168.99.1'}
在Python shell中
>>> import scapy.all as S
>>> s = set() # there will be redundencies so we'll use set to remove them
>>> for line in S.read_routes():
...: s.add(line[4])
...:
>>> s
{'10.0.0.4',
'169.254.106.110',
'169.254.17.51',
'169.254.177.137',
'192.168.56.1',
'192.168.99.1'}
if True:
import scapy
import scapy.all
lt_list = []
for i in scapy.all.conf.ifaces.items():
# ip of all Network Adapter
lv_adapterName = str(i[1].name)
lv_ip = scapy.all.get_if_addr(lv_adapterName)
# print all ip in `python`,
if lv_ip == "0.0.0.0":
continue
print("%s\t[%s]" % (lv_adapterName, lv_ip))
lt_list.append(lv_ip)
# verify it in `powershell`
"""powershell
ipconfig /all
"""