用于提取所有接口 MAC 地址的 Bash 脚本

用于提取所有接口 MAC 地址的 Bash 脚本

我想要创建一个可以与实时 Ubuntu 16 一起使用的 bash 脚本。我在一家拥有多家不同类型主板制造商的制造工厂工作,我们的许多客户在系统发货前都会要求提供其 MAC 地址。网络接口数量可能为 1 到 10 个,系统数量可能为 1 到数百个。

如何创建一个脚本来按照网络接口的顺序推送这些信息,例如:

LAN1 MAC | LAN2 MAC | LAN3 MAC | 等等.. 等等..

到目前为止,我已经编写了一个简单的脚本,它将列出所有接口的所有 MAC 地址,但是我怎样才能按照我想要的顺序排列它们,并确保脚本知道从 LAN1 开始,然后移动到 LAN2......?

#!/bin/bash

MAC1=$(ip a |awk '/ether/ {print $2}')

echo "$MAC"

#end

感谢您的帮助!

答案1

ip link正如 xhienne 提到的,使用一些过滤技术就足够了。我个人使用awk

$ ip -o link  | awk '{print $2,$(NF-2)}'                                                                                 
lo: 00:00:00:00:00:00
eth3: f0:76:1c:8c:6d:f7
wlan7: d0:53:49:3d:53:fd
docker0: 02:42:bc:cd:0b:4d

如果需要的话,也可以使用任何其他语言来完成,例如python

$ cat get_iface_mac.py                                                                                                   
#!/usr/bin/env python
from __future__ import print_function
import netifaces as ni
for iface in ni.interfaces():
     print(iface + " " + ni.ifaddresses(iface)[ni.AF_LINK][0]['addr'])

$ ./get_iface_mac.py                                                                                                     
lo 00:00:00:00:00:00
eth3 f0:76:1c:8c:6d:f7
wlan7 d0:53:49:3d:53:fd
docker0 02:42:bc:cd:0b:4d

答案2

假设 lan1,...,lanN 是网络接口名称,如 eth0,这应该可以解决您的问题:

ip link \
| sed -z 's,\n\s*link/\S*,:,g;' \
| cut -d : -f 2,4- \
| cut -d" " -f2,3 \
| sort

ip link命令列出了网络接口;(GNU)sed基本上连接了行;两者cut提取了所需的内容;最后sort按接口名称的字母顺序进行排序。

相关内容