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,那么您将不得不使用ifconfig和sed方法,因为OS X没有像sysfs这样的虚拟文件系统接口.
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,我的在线界面)
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 版本上测试
| 归档时间: |
|
| 查看次数: |
82170 次 |
| 最近记录: |