Contents

如何获取网络接口的MAC地址

1. 概述

在本教程中,我们将讨论媒体访问控制 (MAC) 地址并学习如何查找网络接口的 MAC 地址。

2.什么是MAC地址?

媒体访问控制 (MAC) 地址也称为硬件地址。它是与网络适配器或网络接口卡 (NIC) 关联的唯一值。 MAC 地址由 48 位组成,由六对用冒号分隔的十六进制数字表示,例如 00:0c:29:cc:55:5e。

虽然每个 NIC 至少有一个 MAC 地址,但多端口 NIC 的每个端口都有一个 MAC 地址

此外,设备驱动程序会自动检测 MAC 地址。然后,卡使用它来确定数据来自哪里以及应该发送到哪里。

使用 MAC 地址的一个示例是 DHCP 服务器使用它来限制和分配 IP 地址给连接的客户端。

3. 查找 MAC 地址

在本节中,我们将介绍两种查找 MAC 地址的方法。

3.1. 使用ip命令

让我们使用ip 命令来查找我们电脑网卡的 MAC 地址:

$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 00:0c:29:cc:55:5e brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.99.91/24 brd 192.168.99.255 scope global dynamic noprefixroute ens33
       valid_lft 6999sec preferred_lft 6999sec
    ... truncated ...

或者,我们可以将此命令简写为ip addr show甚至只是ip a

默认情况下,它非常详细并显示所有已配置网络设备的信息。我们可以通过在show选项后指定网络接口来减少输出:

$ ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 00:0c:29:cc:55:5e brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 192.168.99.91/24 brd 192.168.99.255 scope global dynamic noprefixroute ens33
       valid_lft 4975sec preferred_lft 4975sec
    ... truncated ...

由于我们实际上对 MAC 地址感兴趣,所以**我们可以将ip命令与*grep 结合起来,**甚至将show缩短为s*:

$ ip a s ens33 | grep ether
    link/ether 00:0c:29:cc:55:5e brd ff:ff:ff:ff:ff:ff

在这里,我们可以看到我们网卡的MAC地址是00:0c:29:cc:55:5e。

3.2. 使用ifconfig命令

ifconfig 是一个类似于ip命令的命令。它向我们展示了所有可用接口的信息:

$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.99.91  netmask 255.255.255.0  broadcast 192.168.99.255
        inet6 2a03:7847:2252:199:7dd2:e1f0:6395:9f7  prefixlen 64  scopeid 0x0<global>
        inet6 2a03:7847:2252:199:9589:759e:2e6f:df28  prefixlen 64  scopeid 0x0<global>
        inet6 2a03:7847:2252:199::8bbb  prefixlen 128  scopeid 0x0<global>
        inet6 fe80::6678:3fc6:cb2f:15bb  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:cc:55:5e  txqueuelen 1000  (Ethernet)
        ... truncated ...
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        ... truncated ...

我们可以再次使用grep仅获取 MAC 地址:

$ ifconfig | grep ether
ether 00:0c:29:cc:55:5e  txqueuelen 1000  (Ethernet)

4. 将 MAC 地址存储到 Shell 变量中

有时,我们可能需要该地址进行进一步处理,例如在 shell 脚本中。让我们看看一些方法来做到这一点。

4.1. 使用grep提取 MAC 地址

我们可以使用简单的正则表达式或正则表达式,利用 MAC 地址由六个由冒号分隔的十六进制数字块组成的事实:

$ ifconfig ens33 | grep -o -E ..:..:..:..:..:..
00:0c:29:cc:55:5e

由于这仅返回 MAC 地址,我们可以将其存储在一个变量中:

$ MYMAC=`ifconfig ens33 | grep -o -E ..:..:..:..:..:..`
$ echo $MYMAC
00:0c:29:cc:55:5e

ip命令也是如此:

$ MYMAC=`ip a s ens33 | grep -o -E ..:..:..:..:..:..`
$ echo $MYMAC
00:0c:29:cc:55:5e ff:ff:ff:ff:ff:ff

然而,结果并不像我们预期的那样整洁。因此,我们可以使用更复杂的正则表达式或使用其他工具。

4.2. 使用grepawk提取 MAC 地址

当我们将上面的方法与awk 结合使用时,我们得到了预期的结果:

$ MYMAC=`ip add | grep link/ether | awk '{print $2}'`
$ echo $MYMAC
00:0c:29:cc:55:5e