Получите 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