从使用Python的设备获取MAC地址

问题描述:

我正在寻找一种方法(使用python)从本地网络上的设备获取第二层地址。第三层地址是已知的。从使用Python的设备获取MAC地址

目标是构建一个脚本,该脚本将定期轮询IP地址数据库,以确保MAC地址未发生更改,并且如果他们有,则会向我发送电子邮件警报。

+0

他避免免费ARP,在本地机器上没有检查的东西。仔细阅读问题:**从本地网络上的设备** – 2009-11-17 18:31:55

用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" 
+2

哈,这正是我在写作过程中的答案! – 2009-11-17 18:46:04

+0

如果你没有arp(哪个OpenWRT没有)并且有ip-neighbour软件包(可以安装在OpenWRT上),那么你可以使用这个命令来获得'pid'的值: 'pid = Popen ([“ip”,“neigh”,“show”,IP],stdout = PIPE) – 2015-12-30 07:07:01

听起来像你想监测ARP欺骗者?在这种情况下,您所需要的全部是arpwatch,可以在您附近的每个良好供应的Linux版本中使用。在这里下载源代码:http://ee.lbl.gov/

有一个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) 

不是你要找什么,但肯定在正确的轨道。请享用!

尝试使用在这里找到的netifaces。 netifaces

基于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