![](/img/trans.png)
[英]How to extract IP address ,MAC address and name from dhcp.lease file with a shell script?
[英]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,則必須使用ifconfig
和sed
方法,因為 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 ll
、 ifconfig
或/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.