查当前生效的MAC地址最稳方法是ip link show,它不依赖网卡状态且默认预装;输出中link/ether后十六进制串即当前实际使用的MAC,而ifconfig常因未安装或仅显示UP接口导致遗漏。

查当前生效的 MAC 地址用 ip link show
直接运行 ip link show 是最稳的选择,它不依赖网卡是否 UP,也不要求安装额外包。输出里每块网卡段落下都有 link/ether 行,后面那个十六进制串就是当前实际使用的 MAC 地址。
常见错误现象:执行 ifconfig 报 command not found —— Ubuntu 22.04+、Alpine、CentOS Stream 默认不装 net-tools;即使装了,ifconfig 只显示 UP 的接口,DOWN 状态的网卡会直接被忽略。
- 查单个接口(比如
ens33):ip link show ens33 | grep "link/ether" | awk '{print $2}' - 查所有物理接口(排除
lo、veth、docker0):ip -br link | grep -v "lo$\|veth\|docker0" | awk '{print $1}' | xargs -I{} sh -c 'echo "{} -> $(cat /sys/class/net/{}/address 2>/dev/null)"' - 注意虚拟设备也有
link/ether行,但它们不是物理网卡,别拿vethxxxx的值当真实硬件地址
脚本里读 /sys/class/net/xxx/address 最轻量
在自动化或启动脚本里,别起 ip 或 grep 子进程——直接 cat /sys/class/net/ens33/address,输出就是干净的 00:1a:2b:3c:4d:5e,普通用户权限就能读,没解析开销。
容易踩的坑:硬编码 eth0。现代系统用可预测命名(enp0s3、ens160、ens33),得先动态取名:
- 取主网卡名:
ip -br link | grep -v "lo$" | head -n1 | awk '{print $1}' - 拼接读取:
mac=$(cat /sys/class/net/$(ip -br link | grep -v "lo$" | head -n1 | awk '{print $1}')/address 2>/dev/null) - 如果目标接口名不确定,先
ls /sys/class/net/看一眼再写死
确认出厂物理 MAC 得用 sudo ethtool -P
ip link show 和 /sys/class/net/xxx/address 显示的是当前生效值,可能已被 ip link set dev ens33 address xx:xx:xx:xx:xx:xx 临时改过;只有 ethtool -P 读 EEPROM 才算“出厂身份”。
执行 sudo ethtool -P ens33,输出形如 Permanent address: 00:11:22:33:44:55。但不是所有设备都支持:
- veth、macvlan、部分 USB 网卡、老旧 Realtek 芯片会返回
No data available - 别错用成
ethtool ens33(那是查链路状态),必须带-P参数 - 没权限时会报
Operation not supported,说明驱动不暴露 EEPROM 接口
别信 nmcli device show 的 GENERAL.HWADDR
如果系统跑 NetworkManager,nmcli device show ens33 | grep GENERAL.HWADDR 确实能出值,但它和 ip link show 一样,只反映当前生效 MAC,不是永久地址,也不能绕过软件修改。
更麻烦的是:NetworkManager 有时会缓存旧值,重启服务前可能不刷新;而且它默认只管自己管理的接口(比如 DHCP 启用的),手动配的静态接口或容器桥接网卡常被忽略。
真要审计硬件身份,ethtool -P + 对比 /sys/class/net/xxx/address 是唯一可靠路径。其余方法全是“当前配置快照”,不是“物理指纹”。


















