You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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))

注意事项

  1. 两种方法都需要root权限运行(也就是前面加sudo),因为ARP操作属于底层网络操作,普通用户权限不够。
  2. 目标树莓派必须和你的设备在同一个局域网里,ARP是链路层协议,跨网段的话没法直接获取MAC地址哦。

内容的提问来源于stack exchange,提问作者Long

火山引擎 最新活动