使用shell脚本获取MAC地址

Pra*_*ham 23 linux shell mac-address

目前提到MAC地址的所有解决方案始终使用eth0.但是如果不是eth0我的接口以eth1开头.同样在OS X上,接口名称也不同.
接口eth0也可以存在但未使用.即不活跃,它没有IP.

那么我有没有办法获得第一个可用的活动接口的MAC地址.(即它有一个inet地址,我甚至不希望有一个inet6).

对于Eg

eth0      Link encap:Ethernet  HWaddr <some addr>
          inet6 addr: <some addr> Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:123
          RX packets:123 errors:123 dropped:123 overruns:123 frame:123
          TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
          collisions:123 txqueuelen:123 
          RX bytes:123 (123 MB)  TX bytes:123 (123 KB)
          Interrupt:123 Memory:00000000-00000000

eth1      Link encap:Ethernet  HWaddr <some addr>
          inet addr:<some addr>  Bcast:<some addr>  Mask:<some addr>
          inet6 addr: <some addr> Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:123 Metric:123
          RX packets:123 errors:123 dropped:123 overruns:123 frame:123
          TX packets:123 errors:123 dropped:123 overruns:123 carrier:123
          collisions:123 txqueuelen:123 
          RX bytes:123 (123 MB)  TX bytes:123 (123 KB)
          Interrupt:123 Memory:00000000-00000000
Run Code Online (Sandbox Code Playgroud)

注意:我更改了输出的值.

所以在这种情况下,我希望HWaddr用于eth1而不是eth0.我怎么找到它?它也适用于所有Linux风格.

Jay*_*hoi 58

你可以这样做

ifconfig <Interface ex:eth0,eth1> | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
Run Code Online (Sandbox Code Playgroud)

您也可以按如下方式获取所有接口的MAC

cat /sys/class/net/*/address
Run Code Online (Sandbox Code Playgroud)

对于eth0等特定界面

cat /sys/class/net/eth0/address
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 37

最好的Linux特定解决方案是使用sysfs:

$ IFACE=eth0
$ read MAC </sys/class/net/$IFACE/address
$ echo $IFACE $MAC
eth0 00:ab:cd:12:34:56
Run Code Online (Sandbox Code Playgroud)

与其他方法相比,此方法非常干净,并且不会生成其他进程,因为它read是POSIX shell的内置命令,包括非BASH shell.但是,如果您需要可移植到OS X,那么您将不得不使用ifconfigsed方法,因为OS X没有像sysfs这样的虚拟文件系统接口.

  • 这应该是最好的答案! (2认同)

Eli*_*Luz 25

$ ip route show default | awk '/default/ {print $5}'
Run Code Online (Sandbox Code Playgroud)

return:eth0(我的在线界面)

$ cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address
Run Code Online (Sandbox Code Playgroud)

return:ec:a8:6b:bd:55:05(eth0的macaddress,我的在线界面)

终端图像

  • 欢迎来到 Stackoverflow。请发布有关您的答案的更多信息。它在做什么以及为什么。 (2认同)
  • 我认为最好的答案。其他的要么无法正常工作,要么依赖于固定的接口名称。 (2认同)

ger*_*los 17

在现代GNU/Linux系统上,您可以看到列出内容的可用网络接口/sys/class/net/,例如:

$ ls /sys/class/net/
enp0s25  lo  virbr0  virbr0-nic  wlp2s0
Run Code Online (Sandbox Code Playgroud)

您可以在设备目录中检查接口是否up正在查看operstate.例如,以下是您如何查看是否enp0s25已启动:

$ cat /sys/class/net/enp0s25/operstate
up
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下命令获取该接口的MAC地址:

$ cat /sys/class/net/enp0s25/address 
ff:00:ff:e9:84:a5
Run Code Online (Sandbox Code Playgroud)

例如,这是一个简单的bash脚本,它为活动接口输出MAC地址:

#!/bin/bash
# getmacifup.sh: Print active NICs MAC addresses
D='/sys/class/net'
for nic in $( ls $D )
do
    echo $nic
    if  grep -q up $D/$nic/operstate
    then
        echo -n '   '
        cat $D/$nic/address
    fi
done
Run Code Online (Sandbox Code Playgroud)

这是在具有以太网和wifi接口的系统上的输出:

$ ./getmacifup.sh
enp0s25
   ff:00:ff:e9:84:a5
lo
wlp2s0
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅内核文档


还要记住,从2015年开始,大多数GNU/Linux发行版都切换到了systemd,并且不再使用ethX接口命名方案 - 现在它们使用基于硬件拓扑的更强大的命名约定,请参阅:


tri*_*eee 11

注意,接口名称和MAC地址是没有前导空格的行上的第一个和最后一个字段.

如果其中一个缩进行包含inet addr:最新的接口名称,则应打印MAC地址.

ifconfig -a |
awk '/^[a-z]/ { iface=$1; mac=$NF; next }
    /inet addr:/ { print iface, mac }'
Run Code Online (Sandbox Code Playgroud)

请注意,多个接口可以满足您的条件.然后,脚本将打印多行.(; exit如果你总是只想打印第一场比赛,你可以在最后一个结束括号之前添加.)


小智 5

只需运行:

ifconfig | grep ether | cut -d " " -f10
Run Code Online (Sandbox Code Playgroud)

或者

ip a | grep ether | cut -d " " -f6
Run Code Online (Sandbox Code Playgroud)

这两个示例命令将 grep 所有带有“ether”字符串的行,并在 grepped 部分的数字空格(在 -f 选项中指定)之后剪切 mac 地址(我们需要的)。

在不同的 Linux 版本上测试