目前提到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风格。
答案 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,那么您必须使用ifconfig
和sed
方法,因为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,我的在线界面)
答案 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 l
,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
或我的丑陋脚本使它更易于分析(未经测试的驱动程序/ 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