最可靠方法是用ip link show:执行ip link show ens33,在link/ether后找到十六进制字符串即当前生效mac地址;它默认预装、不依赖网卡状态、字段固定,比ifconfig更通用稳定。

直接看 ip link show,这是当前最稳、最通用的方法;别硬套 ifconfig,它在很多新系统里根本不存在,或者只显示启用的接口,容易漏掉关键信息。
用 ip link show 查当前生效的 MAC 地址
输出里 link/ether 后面那个十六进制串就是当前实际使用的 MAC,不管网卡是 UP 还是 DOWN 都能查到。
- 查单个接口(比如
ens33):ip link show ens33 | grep "link/ether" | awk '{print $2}' - 查所有接口的 MAC:
ip -br link | while read i; do echo "$i -> $(ip link show ${i%%:*} | grep 'link/ether' | awk '{print $2}')"; done - 注意:虚拟设备(如
veth、docker0)也会有link/ether行,要结合接口名前缀(如2: ens33:)确认归属,避免误读
脚本里优先读 /sys/class/net/xxx/address
不用起子进程、不依赖命令解析,cat /sys/class/net/ens33/address 输出就是纯 00:1a:2b:3c:4d:5e,普通用户权限就能读。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 先动态取主网卡名:
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) - 别硬编码
eth0——现代发行版多用enp0s3、ens160等可预测命名,ls /sys/class/net/看一眼最保险
查永久 MAC 必须用 sudo ethtool -P
/sys/class/net/xxx/address 和 ip link show 显示的是当前生效值,可能已被 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参数
为什么 ifconfig 容易出问题
它属于已淘汰的 net-tools 包,Ubuntu 22.04+、Alpine、CentOS Stream 默认不装,直接运行会报 command not found。
- 即使装了,
ifconfig默认只列UP接口;ip link show则无论启停都能返回完整设备列表 - 字段名不统一:老版本用
HWaddr,新版本用ether,脚本里得写两套匹配逻辑 -
ifconfig eth0 | grep ether在某些精简容器环境里根本跑不起来,而ip和/sys/class/net/几乎无依赖
真正麻烦的点不在“怎么查”,而在“查哪个值”——当前生效的?配置文件里写的?还是 EEPROM 里的永久值?不同场景要对应不同命令,混用会导致排查方向完全跑偏。










