从使用Python的设备获取MAC地址
我正在寻找一种方法(使用python)从本地网络上的设备获取第二层地址。第三层地址是已知的。从使用Python的设备获取MAC地址
目标是构建一个脚本,该脚本将定期轮询IP地址数据库,以确保MAC地址未发生更改,并且如果他们有,则会向我发送电子邮件警报。
用Python来回答这个问题取决于你的平台。我没有Windows,所以下面的解决方案在我写的Linux机器上工作。对正则表达式的小改动会使其在OS X中工作。
首先,您必须ping目标。这将放置目标 - 只要它位于你的网络掩码中,在你的系统的ARP缓存中,这听起来像是在这种情况下。注意:
13:40 [email protected]% ping 97.107.138.15
PING 97.107.138.15 (97.107.138.15) 56(84) bytes of data.
64 bytes from 97.107.138.15: icmp_seq=1 ttl=64 time=1.25 ms
^C
13:40 [email protected]% arp -n 97.107.138.15
Address HWtype HWaddress Flags Mask Iface
97.107.138.15 ether fe:fd:61:6b:8a:0f C eth0
知道了,你做一个小魔子 - 否则你写的ARP缓存检查代码你自己,你不想这样做:
>>> from subprocess import Popen, PIPE
>>> import re
>>> IP = "1.2.3.4"
>>> # do_ping(IP)
>>> # The time between ping and arp check must be small, as ARP may not cache long
>>> pid = Popen(["arp", "-n", IP], stdout=PIPE)
>>> s = pid.communicate()[0]
>>> mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0]
>>> mac
"fe:fd:61:6b:8a:0f"
哈,这正是我在写作过程中的答案! – 2009-11-17 18:46:04
如果你没有arp(哪个OpenWRT没有)并且有ip-neighbour软件包(可以安装在OpenWRT上),那么你可以使用这个命令来获得'pid'的值: 'pid = Popen ([“ip”,“neigh”,“show”,IP],stdout = PIPE) – 2015-12-30 07:07:01
有一个similar question不久前在这个网站上回答。正如提问者所选择的答案中所提到的那样,Python没有内置的方法来实现它。您必须调用系统命令(例如arp
)以获取ARP信息,或使用Scapy生成您自己的数据包。
编辑:使用Scapy的from their website一个例子:
这里是另一个工具,将 不断监视 机和打印所有ARP请求它 看到在所有接口上,即使是在从802.11帧 Wi-Fi卡处于监视模式。注意 store = 0参数sniff()避免 存储所有数据包在内存中的 什么也没有。
#! /usr/bin/env python
from scapy import *
def arp_monitor_callback(pkt):
if ARP in pkt and pkt[ARP].op in (1,2): #who-has or is-at
return pkt.sprintf("%ARP.hwsrc% %ARP.psrc%")
sniff(prn=arp_monitor_callback, filter="arp", store=0)
不是你要找什么,但肯定在正确的轨道。请享用!
基于Unix系统:
#!/usr/bin/env python2.7
import re
import subprocess
arp_out =subprocess.check_output(['arp','-lan'])
re.findall(r"((\w{2,2}\:{0,1}){6})",arp_out)
将返回元组的列表与Mac电脑。 scapy是一个了不起的工具,但似乎是这种情况下的矫枉过正
在Linux有时你会错过命令行util“arp”。例如,基于yocto linux嵌入式环境的图像。
没有 “ARP” 工具的另一种方法是读取和解析文件/ proc /网/ ARP:
[email protected]:~# cat /proc/net/arp
IP address HW type Flags HW address Mask Device
192.168.1.1 0x1 0x2 xx:xx:xx:xx:xx:xx * wlan0
192.168.1.33 0x1 0x2 yy:yy:yy:yy:yy:yy * wlan0
一个更简单的方法,如果在Linux上:
print os.system('arp -n ' + str(remoteIP))
您将获得:
Address HWtype HWaddress Flags Mask Iface
192.168..... ether 9B:39:15:f2:45:51 C wlan0
他避免免费ARP,在本地机器上没有检查的东西。仔细阅读问题:**从本地网络上的设备** – 2009-11-17 18:31:55