Получите MAC-адрес с помощью оболочки 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
ПРИМЕЧАНИЕ. Я изменил значения вывода.
Итак, в этом случае я хочу HWaddr для eth1, а не eth0.
Как его найти? Также он должен работать на всех вариантах Linux.
Ответы
Ответ 1
Обратите внимание, что имя интерфейса и MAC-адрес - это первое и последнее поля в строке без начального пробела.
Если одна из строк с отступом содержит inet addr:
, должно быть напечатано имя последнего интерфейса и MAC-адрес.
ifconfig -a |
awk '/^[a-z]/ { iface=$1; mac=$NF; next }
/inet addr:/ { print iface, mac }'
Обратите внимание, что несколько интерфейсов могут соответствовать вашим критериям. Затем script напечатает несколько строк. (Вы можете добавить ; exit
непосредственно перед окончательной скобкой закрытия, если вы всегда хотите только напечатать первое совпадение.)
Ответ 2
Вы можете сделать следующее:
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
Ответ 3
Лучшим решением для Linux является использование sysfs:
$ IFACE=eth0
$ read MAC </sys/class/net/$IFACE/address
$ echo $IFACE $MAC
eth0 00:ab:cd:12:34:56
Этот метод чрезвычайно чист по сравнению с другими и не генерирует никаких дополнительных процессов, поскольку read
является встроенной командой для оболочек POSIX, включая оболочки BASH. Однако, если вам нужна переносимость в OS X, вам придется использовать методы ifconfig
и sed
, так как OS X не имеет интерфейса виртуальной файловой системы, такого как sysfs.
Ответ 4
$ ip route show default | awk '/default/ {print $5}'
return: eth0 (мой онлайн-интерфейс)
$ cat /sys/class/net/$(ip route show default | awk '/default/ {print $5}')/address
return: ec: a8: 6b: bd: 55: 05 (macaddress of eth0, мой онлайн-интерфейс)
Изображение терминала
Ответ 5
В современной системе 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
И вот его вывод на систему с Ethernet и интерфейсом Wi-Fi:
$ ./getmacifup.sh
enp0s25
ff:00:ff:e9:84:a5
lo
wlp2s0
Подробности смотрите в документации ядра.
Помните также, что с 2015 года большинство дистрибутивов GNU/Linux перешли на systemd
и больше не используют eспасибо
именования интерфейса eспасибо
- теперь они используют более надежное соглашение об именах, основанное на топологии оборудования, см.
Ответ 6
oh, если вы хотите только mac mac mac address, вы можете использовать это:
ifconfig | grep "ether*" | tr -d ' ' | tr -d '\t' | cut -c 6-42
(работа с макинтошем)
-
ifconfig
- получить всю информацию
-
grep
- сохранить строку с адресом
-
tr
- очистить все
-
cut
- удалите "эфир", чтобы иметь только адрес
Ответ 7
Просто запустите:
ifconfig | grep ether | cut -d " " -f10
ИЛИ ЖЕ
ip a | grep ether | cut -d " " -f6
Эти две примерные команды соберут все строки с "эфирной" строкой и обрежут MAC-адрес (который нам нужен) после числовых пробелов (указанных в опции -f) выделенной части.
Проверено на разных вкусах Linux
Ответ 8
Здесь альтернативный ответ в случае, если перечисленные выше не работают для вас. Вы также можете использовать следующие решения, которые были найдены здесь:
ip addr
ИЛИ ЖЕ
ip addr show
ИЛИ ЖЕ
ip link
Все три из них будут показывать ваш MAC-адрес (а) рядом со link/ether
. Я наткнулся на это, потому что я только что сделал новую установку Debian 9.5 с USB-накопителя без доступа к Интернету, поэтому я мог сделать только очень минимальную установку, и получил
-bash: ifconfig: command not found
когда я попробовал некоторые из вышеуказанных решений. Я полагал, что кто-то еще может столкнуться с этой проблемой. Надеюсь, поможет.
Ответ 9
Я знаю, что это немного устарело, но с помощью основных команд мы можем взять MAC-адрес интерфейса:
ip link show eth0 | grep link/ether | awk '{print $2}'
Хорошего дня!
Ответ 10
Получить MAC-адрес для eth0:
$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25
Пример:
[[email protected] ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep HWADDR | cut -c 9-25
55:b5:00:10:be:10