Linux下怎么读取MAC地址

发布时间:2022-01-26 09:10:28 作者:小新
来源:亿速云 阅读:291
# Linux下怎么读取MAC地址

## 前言

MAC地址(Media Access Control Address)是网络设备的唯一硬件标识符,由48位二进制数组成,通常表示为12个十六进制数字(如`00:1A:2B:3C:4D:5E`)。在Linux系统中,获取MAC地址是网络配置、设备管理和故障排查中的常见需求。本文将详细介绍多种获取MAC地址的方法及其应用场景。

---

## 一、使用`ifconfig`命令

### 1.1 基本用法
`ifconfig`(interface configuration)是传统的网络接口配置工具,多数Linux发行版默认安装:
```bash
ifconfig

输出示例:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:1a:2b:3c:4d:5e  txqueuelen 1000  (Ethernet)
        RX packets 12045  bytes 1023345 (1.0 MB)
        TX packets 8045  bytes 1256789 (1.2 MB)

其中ether后即为MAC地址。

1.2 指定网卡查询

ifconfig eth0 | grep ether

注意:部分新系统可能需安装net-tools包:

> sudo apt install net-tools  # Debian/Ubuntu
> sudo yum install net-tools  # CentOS/RHEL
> ```

---

## 二、使用`ip link`命令

### 2.1 现代替代方案
`ip`命令来自`iproute2`工具集,是推荐的新一代网络工具:
```bash
ip link show

输出片段:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 00:1a:2b:3c:4d:5e brd ff:ff:ff:ff:ff:ff

2.2 精确提取MAC地址

ip link show eth0 | awk '/link\/ether/{print $2}'

三、通过/sys文件系统

3.1 直接读取设备文件

Linux内核通过sysfs虚拟文件系统暴露硬件信息:

cat /sys/class/net/eth0/address

输出示例:

00:1a:2b:3c:4d:5e

3.2 批量获取所有接口MAC

ls /sys/class/net/ | while read dev; do echo -n "$dev: "; cat /sys/class/net/$dev/address; done

四、使用nmcli(NetworkManager)

4.1 查询已连接设备

适用于使用NetworkManager管理的系统:

nmcli device show eth0 | grep GENERAL.HWADDR

输出:

GENERAL.HWADDR:                         00:1A:2B:3C:4D:5E

4.2 列出所有设备MAC

nmcli device show | awk '/GENERAL.DEVICE:|GENERAL.HWADDR/'

五、特殊场景处理

5.1 虚拟接口过滤

排除lodocker等虚拟接口:

ip link | awk '/link\/ether/ && !/docker|virbr|veth/{print $2}'

5.2 无线网卡MAC地址

iw dev wlan0 info | grep addr

5.3 USB网卡识别

lsusb -tv | grep -i ethernet
dmesg | grep -i 'usb.*mac'

六、编程语言实现

6.1 Python示例

import fcntl
import socket
import struct

def get_mac(interface='eth0'):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', interface[:15].encode()))
    return ':'.join(f'{b:02x}' for b in info[18:24])

print(get_mac())

6.2 Bash脚本

#!/bin/bash
INTERFACE=${1:-eth0}
MAC=$(cat /sys/class/net/$INTERFACE/address 2>/dev/null)
[ -z "$MAC" ] && echo "Interface $INTERFACE not found" || echo "$INTERFACE MAC: $MAC"

七、MAC地址修改与欺骗

7.1 临时修改MAC地址

sudo ip link set dev eth0 down
sudo ip link set dev eth0 address 00:11:22:33:44:55
sudo ip link set dev eth0 up

7.2 永久修改(Debian系)

编辑/etc/network/interfaces

auto eth0
iface eth0 inet dhcp
    hwaddress ether 00:11:22:33:44:55

警告:修改MAC地址可能违反网络策略,操作前需获得授权。


八、MAC地址的应用场景

  1. 设备识别:路由器DHCP绑定特定设备
  2. 网络准入控制:企业网络MAC白名单
  3. 流量管理:QoS策略基于MAC地址实施
  4. 虚拟化环境:VMware/KVM虚拟机MAC分配
  5. 安全审计:检测网络中的异常设备

九、常见问题解答

Q1: 为什么ifconfig不显示MAC地址?

Q2: 如何判断MAC地址是否被伪造?

Q3: 虚拟机MAC地址有何特点?


结语

掌握Linux下读取MAC地址的多种方法,能够灵活应对不同场景需求。建议优先使用ip link/sys文件系统等现代工具,同时注意MAC地址相关的安全策略。如需进一步自动化管理,可结合脚本或编程接口实现。

扩展阅读: - IEEE OUI数据库:https://standards.ieee.org/products-services/regauth/oui/ - macchanger工具:批量修改MAC地址 - RFC 7042:MAC地址行为准则 “`

(全文约1850字,实际字数可能因显示格式略有差异)

推荐阅读:
  1. C#通过WMI读取MAC地址
  2. linux下怎么修改MAC地址

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

linux mac

上一篇:Linux常用命令都有什么呢

下一篇:@Transactional注解怎么用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》