如何用Python代码通过IP地址获取远程树莓派的MAC地址
嘿,我来帮你解决这个提取MAC地址的问题!不用再调用系统命令然后手动扒拉输出了,用Python可以更优雅地搞定,给你两种实用方法:
方法一:解析系统arp命令的输出(无需额外安装库)
这种方法直接用Python的subprocess模块捕获arp -n的输出,然后精准提取你要的HWaddress,比os.system灵活多了:
import subprocess def get_mac_from_arp(target_ip): try: # 执行arp命令并捕获输出,避免直接打印到终端 cmd_result = subprocess.run( ["sudo", "arp", "-n", target_ip], capture_output=True, text=True, check=True ) # 把输出按行拆分,跳过第一行表头 output_lines = cmd_result.stdout.strip().split("\n")[1:] for line in output_lines: # 按空格拆分,过滤掉多余的空字符串 line_parts = list(filter(None, line.split())) # 找到对应目标IP的行,提取第4个元素就是MAC地址 if line_parts[0] == target_ip: return line_parts[3] return f"没找到IP {target_ip}对应的MAC地址哦" except subprocess.CalledProcessError as e: return f"执行命令出错啦: {e.stderr.strip()}" # 测试一下 target_ip = "115.0.0.2" print(get_mac_from_arp(target_ip))
为什么用subprocess而不是os.system?
os.system只能返回命令的退出码,没法直接获取输出内容,而subprocess.run可以捕获stdout和stderr,方便我们后续解析。check=True会在命令执行失败(比如IP不存在)时抛出异常,方便我们处理错误情况。
方法二:用Scapy直接发送ARP请求(更专业的网络方式)
如果不想依赖系统的arp命令,可以用Scapy这个强大的网络库,直接构造ARP请求包来获取MAC地址,更贴近底层原理:
首先得先安装Scapy:
pip install scapy
然后写代码:
from scapy.layers.l2 import ARP, Ether from scapy.sendrecv import srp def get_mac_with_scapy(target_ip): # 构造ARP请求,指定目标IP arp_packet = ARP(pdst=target_ip) # 构造以太网广播帧,确保所有设备都能收到请求 ether_frame = Ether(dst="ff:ff:ff:ff:ff:ff") # 把ARP包封装到以太网帧里 full_packet = ether_frame / arp_packet # 发送数据包并接收响应,timeout设为2秒,关闭冗余输出 responses, _ = srp(full_packet, timeout=2, verbose=0) # 从响应里提取MAC地址 for _, response in responses: return response.hwsrc return f"无法获取IP {target_ip}的MAC地址" # 测试 target_ip = "115.0.0.2" print(get_mac_with_scapy(target_ip))
注意事项
- 两种方法都需要root权限运行(也就是前面加
sudo),因为ARP操作属于底层网络操作,普通用户权限不够。 - 目标树莓派必须和你的设备在同一个局域网里,ARP是链路层协议,跨网段的话没法直接获取MAC地址哦。
内容的提问来源于stack exchange,提问作者Long




