簡體   English   中英

使用shell腳本獲取MAC地址

[英]Get MAC address using shell script

目前所有提到的獲取 MAC 地址的解決方案總是使用 eth0。 但是,如果我的接口不是 eth0,而是以 eth1 開頭呢? 在 OS X 上,接口名稱也不同。
此外,接口 eth0 可能存在但未使用。 即不活躍,它沒有IP。

那么有沒有辦法獲得第一個可用接口的 MAC 地址,該接口是活動的。(即它有一個 inet 地址,我什至不想要一個有 inet6 的地址)。

例如

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

注意:我已經更改了輸出的值。

所以在這種情況下,我想要 eth1 而不是 eth0 的 HWaddr。 我如何找到它? 它也應該適用於所有 Linux 風格。

您可以執行以下操作

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

最好的 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 這樣的虛擬文件系統接口。

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

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

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

返回: ec:a8:6b:bd:55:05 (eth0的mac地址,我的在線界面)

終端形象

在現代 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

有關詳細信息,請參閱內核文檔


還要記住,從 2015 年開始,大多數 GNU/Linux 發行版都切換到systemd ,並且不再使用ethX接口命名方案 - 現在它們使用基於硬件拓撲的更強大的命名約定,請參閱:

觀察接口名稱和 MAC 地址是一行中的第一個和最后一個字段,沒有前導空格。

如果縮進的行之一包含inet addr:應打印最新的接口名稱和 MAC 地址。

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

請注意,多個接口可以滿足您的條件。 然后,腳本將打印多行。 (如果您總是只想打印第一個匹配項,則可以在最后一個右大括號之前添加; exit 。)

只需運行:

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

或者

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

這兩個示例命令將 grep 所有帶有“ether”字符串的行,並在 grepped 部分的數字空格(在 -f 選項中指定)之后剪切 mac 地址(我們需要的)。

在不同的 Linux 版本上測試

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

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

(在 Macintosh 上工作)

  • ifconfig -- 獲取所有信息
  • grep -- 保留地址行
  • tr -- 清除所有
  • cut - 刪除“ether”以僅包含地址

我知道這有點過時了,但是使用基本命令,我們可以獲取接口的 mac 地址:

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

祝你今天過得愉快!

以上都不適合我,因為我的設備處於平衡狀態。 查詢要么會說與ip llifconfig/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

或者我丑陋的腳本使它更易於解析(未經測試的驅動程序/操作系統/任何兼容性):

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

我使用命令 hciconfig 和兩個 grep 來分隔 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}'

這是在 Armbian 上唯一對我有用的東西:

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

這是我的解決方案:

 ip a | grep link/ether | awk -F " " '{print $2}'

這是一個替代答案,以防上面列出的答案對您不起作用。 您也可以使用以下解決方案,可在此處找到:

ip addr

或者

ip addr show

或者

ip link

所有這三個都將在link/ether旁邊顯示您的 MAC 地址。 我偶然發現了這一點,因為我剛剛從沒有互聯網訪問的 USB 記憶棒上全新安裝了 Debian 9.5,所以我只能進行非常小的安裝,並收到了

-bash: ifconfig: command not found

當我嘗試了上述一些解決方案時。 我想其他人也可能會遇到這個問題。 希望能幫助到你。

獲取 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM