使用 python 从 MAC 获取 IP 地址
Obtain IP Address from MAC using python
我的本地网络中有一个设备并且知道它的 MAC 地址。它通过 DHCP 自动获取 IP 地址。我想获取这个IP
我不想使用 nmap 但 scapy 会很好,因为我正在从 kivy 应用程序导入。
我发现:
from scapy.all import srp, Ether, ARP
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2)
并与
ans.summary()
我得到以下输出:
Ether / ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether / ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1
我的两个问题是:
1:我必须 运行 使用 sudo python 的脚本,我不确定 kivy 中的权限。
2:有没有一种简单的方法可以从 .summary() 中获取 IP/MAC 的变量?
如果摘要的结构始终相同(我假设的),那么您可以 import re
并使用正则表达式来提取 IP 地址。
应该是这样的:
re.sub(r'.* says (.*) ==> Ether / ARP is.*', r'', ans.summary())
对我有用:
>>> import re
>>> x = "Ether / ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether / ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1"
>>> re.sub(r'.* says (.*) ==> Ether / ARP is.*', r'', x)
'192.168.43.92'
是的,您可以使用 scapy 来做到这一点。这是 ARP is-at 数据包的示例:
###[ Ethernet ]###
dst= 08:00:27:fa:25:8e
src= 08:00:27:b1:af:68
type= 0x806
###[ ARP ]###
hwtype= 0x1
ptype= 0x800
hwlen= 6
plen= 4
op= is-at
hwsrc= 08:00:27:b1:af:68
psrc= 192.168.56.102
hwdst= 08:00:27:fa:25:8e
pdst= 192.168.56.101
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00'
您可以将 hwsrc 和 psrc 值分配给这样的变量
srcMAC = pkt[ARP].hwsrc
srcIP = pkt[ARP].psrc
或者像这样打印它们
print pkt[ARP].hwsrc
print pkt[ARP].psrc
希望对您有所帮助。
我的本地网络中有一个设备并且知道它的 MAC 地址。它通过 DHCP 自动获取 IP 地址。我想获取这个IP
我不想使用 nmap 但 scapy 会很好,因为我正在从 kivy 应用程序导入。
我发现:
from scapy.all import srp, Ether, ARP
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.1.0/24"),timeout=2)
并与
ans.summary()
我得到以下输出:
Ether / ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether / ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1
我的两个问题是:
1:我必须 运行 使用 sudo python 的脚本,我不确定 kivy 中的权限。
2:有没有一种简单的方法可以从 .summary() 中获取 IP/MAC 的变量?
如果摘要的结构始终相同(我假设的),那么您可以 import re
并使用正则表达式来提取 IP 地址。
应该是这样的:
re.sub(r'.* says (.*) ==> Ether / ARP is.*', r'', ans.summary())
对我有用:
>>> import re
>>> x = "Ether / ARP who has 192.168.43.1 says 192.168.43.92 ==> Ether / ARP is at 3e:f8:d9:45:1b:3d says 192.168.43.1"
>>> re.sub(r'.* says (.*) ==> Ether / ARP is.*', r'', x)
'192.168.43.92'
是的,您可以使用 scapy 来做到这一点。这是 ARP is-at 数据包的示例:
###[ Ethernet ]###
dst= 08:00:27:fa:25:8e
src= 08:00:27:b1:af:68
type= 0x806
###[ ARP ]###
hwtype= 0x1
ptype= 0x800
hwlen= 6
plen= 4
op= is-at
hwsrc= 08:00:27:b1:af:68
psrc= 192.168.56.102
hwdst= 08:00:27:fa:25:8e
pdst= 192.168.56.101
###[ Padding ]###
load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x00'
您可以将 hwsrc 和 psrc 值分配给这样的变量
srcMAC = pkt[ARP].hwsrc
srcIP = pkt[ARP].psrc
或者像这样打印它们
print pkt[ARP].hwsrc
print pkt[ARP].psrc
希望对您有所帮助。