使用shell脚本获取MAC地址

时间:2014-05-23 11:47:32

标签: linux shell mac-address

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

有没有办法可以获得第一个可用的Active接口的MAC地址。(即它有一个inet地址,我甚至不希望有一个inet6)。

对于E.g

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

注意:我更改了输出值。

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

13 个答案:

答案 0 :(得分:51)

您可以执行以下操作

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

您也可以按如下方式获取所有界面的MAC

cat /sys/class/net/*/address

对于特殊界面,例如eth0

cat /sys/class/net/eth0/address

答案 1 :(得分:31)

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

$ IFACE=eth0
$ read MAC </sys/class/net/$IFACE/address
$ echo $IFACE $MAC
eth0 00:ab:cd:12:34:56

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

答案 2 :(得分:22)

    PackageManager pm = getApplicationContext().getPackageManager();
    ComponentName compName =
            new ComponentName(getPackageName(), getPackageName() + ".AliasFirstActivity");
    pm.setComponentEnabledSetting(
            compName,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);

返回: eth0 (我的在线界面)

$ ip route show default | awk '/default/ {print $5}'

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

Terminal image

答案 3 :(得分:13)

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

$ ls /sys/class/net/
enp0s25  lo  virbr0  virbr0-nic  wlp2s0

您可以检查界面是up ,查看设备目录中的operstate。例如,以下是您可以查看enp0s25是否已启动的方式:

$ cat /sys/class/net/enp0s25/operstate
up

然后您可以获取该接口的MAC地址

$ cat /sys/class/net/enp0s25/address 
ff:00:ff:e9:84:a5

例如,这是一个简单的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

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

$ ./getmacifup.sh
enp0s25
   ff:00:ff:e9:84:a5
lo
wlp2s0

有关详细信息,请参阅Kernel documentation

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

答案 4 :(得分:10)

观察接口名称和MAC地址是没有前导空格的行上的第一个和最后一个字段。

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

ifconfig -a |
awk '/^[a-z]/ { iface=$1; mac=$NF; next }
    /inet addr:/ { print iface, mac }'

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

答案 5 :(得分:2)

哦,如果你只想要mac ether mac地址,可以使用:

ifconfig | grep "ether*" | tr -d ' ' | tr -d '\t' | cut -c 6-42

(在macintosh上工作)

  • ifconfig - 获取所有信息
  • grep - 保留地址
  • tr - 全部清理
  • cut - 删除&#34; ether&#34;只有地址

答案 6 :(得分:1)

只需运行:

ifconfig | grep ether | cut -d " " -f10

OR

ip a | grep ether | cut -d " " -f6

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

在不同的Linux版本上进行了测试

答案 7 :(得分:1)

以上所有内容均不适用于我,因为我的设备处于balance-rr绑定状态。查询任一将使用ip l lifconfig/sys/class/net/${device}/address说相同的MAC地址,因此其中一个是正确的,一个是未知的。

但是,如果您没有重命名设备(关于我错过的任何提示吗?),这将起作用:

udevadm info -q all --path "/sys/class/net/${device}"

即使您将其重命名(例如ip l set name x0 dev p4p1),此方法也有效:

cat /proc/net/bonding/bond0

或我的丑陋脚本使它更易于分析(未经测试的驱动程序/ os /任何兼容性):

awk -F ': ' '
         $0 == "" && interface != "" {
            printf "%s %s %s\n", interface, mac, status;
            interface="";
            mac=""
         }; 
         $1 == "Slave Interface" {
            interface=$2
         }; 
         $1 == "Permanent HW addr" {
            mac=$2
         };
         $1 == "MII Status" {
            status=$2
         };
         END {
            printf "%s %s %s\n", interface, mac, status
         }' /proc/net/bonding/bond0

答案 8 :(得分:0)

如果上面列出的问题对您不起作用,请使用以下替代方法。您也可以使用以下here找到的解决方案:

ip addr

OR

ip addr show

OR

ip link

所有这三个选项将在link/ether旁边显示您的MAC地址。我偶然发现这是因为我刚刚从USB记忆棒上重新安装了Debian 9.5,没有互联网访问权限,所以我只能做一个很小的安装,并收到

-bash: ifconfig: command not found

当我尝试上述解决方案时。我认为其他人也可能会遇到这个问题。希望对您有所帮助。

答案 9 :(得分:0)

我知道有些过时了,但是使用基本命令,我们可以获取接口的mac地址:

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

祝您愉快

答案 10 :(得分:0)

我已经使用命令hcicongif和两个抓钩来分隔PC Mac地址,并且将MAC地址保存为变量

PCMAC=$( hciconfig -a | grep -E 'BD Address:' | grep -Eo '[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}' )

您还可以使用此命令检查MAC地址是否为有效格式。请注意,仅允许使用大字符AF,并且还需要为此grep命令添加输入:

grep -E '[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}:[A-F0-9]{2}'

答案 11 :(得分:0)

这是唯一在Armbian上对我有用的东西:

dmesg | grep -oE 'mac=.*\w+' | cut -b '5-'

答案 12 :(得分:-1)

获取eth0的MAC地址:

$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25

示例:

[me@machine ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25
55:b5:00:10:be:10