Лучший способ извлечь MAC-адрес из вывода ifconfig?

Как лучше всего извлечь MAC-адрес из вывода ifconfig?

Пример вывода:

bash-3.00# ifconfig eth0        
eth0      Link encap:Ethernet  HWaddr 1F:2E:19:10:3B:52    
          inet addr:127.0.0.66  Bcast:127.255.255.255  Mask:255.0.0.0    
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          ....
          ....

Должен ли я использовать cut, AWK или что-то еще, и каковы достоинства и недостатки одного метода над другим.

Какой из них MAC-адрес?

Nabin 16.09.2014 15:36

@ Nabin: поле "HWaddr".

Peter Mortensen 22.11.2014 19:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
61
2
98 325
19

Ответы 19

Не уверен, действительно ли есть какие-то преимущества, но вы можете просто использовать awk:

ifconfig eth0 | awk '/HWaddr/ {print $5}'

Используйте ip addr вместо ifconfig. ip addr | grep -C1 "link/ether" должен делать.

nPcomp 29.12.2016 22:12

Я хотел бы использовать:

ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

-O заставит grep печатать только ту часть строки, которая соответствует выражению. [[:xdigit:]]{1,2} будет соответствовать 1 или 2 шестнадцатеричным цифрам (Solaris не выводит ведущие нули).

Какие? Это будет соответствовать независимо от размещения MAC-адреса, тогда как другие решения не будут.

Robert Gamble 29.10.2008 09:04

У него есть то преимущество, что он также работает с OSX, поскольку ifconfig использует эфир вместо HWaddr.

albertb 29.10.2008 09:07

Это было моим намерением, я работал с множеством разных Unix, и это единственное решение, которое будет работать на всех из них.

Robert Gamble 29.10.2008 09:10

Я не понимаю отрицательного голоса, моя первоначальная мысль заключалась в том, что он чрезмерно спроектирован для работы, но он работает и лучше работает с немного другим выводом (я бы хотел поместить его в скрипт, чтобы мне не нужно было запоминать регулярное выражение).

paxdiablo 29.10.2008 09:51

Этот «grep -o» также является полезным дополнением к моим знаниям.

paxdiablo 29.10.2008 09:53

Существуют ли какие-либо UNICES, которые не выводят начальные нули для разделов MAC (что требует "{1,2}" вместо "{2}")?

paxdiablo 29.10.2008 09:57

Это лучший способ, который я видел. Это потому, что эта команда будет полезна не только с ifconfig, но и с любым другим источником MAC, например, с извлечением MACS Xen DomU с помощью xm network-list MACS ARP caché и т. д.

Álvaro 12.03.2012 13:04

Я использовал ifconfig eth0 | grep -Eo '([[:xdigit:]]{1,2}[:-]){5}[[:xdigit:]]{1,2}' | head -n1 для компенсации устройств, которые содержат «-» вместо «:» и / или сообщают более 6 байтов.

Darcara 30.09.2013 00:09

Мне нравится использовать / sbin / ip для такого рода задач, потому что его гораздо проще разобрать:

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:30:21:48 brd ff:ff:ff:ff:ff:ff

Вы можете легко получить MAC-адрес из этого вывода с помощью awk:

$ ip link show eth0 | awk '/ether/ {print $2}'
00:0c:29:30:21:48

Если вы хотите приложить немного больше усилий и проанализировать больше данных, я рекомендую использовать аргумент -online для команды ip, что позволит вам рассматривать каждую строку как новое устройство:

$ ip -o link 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue \    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000\    link/ether 00:0c:29:30:21:48 brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000\    link/ether 00:0c:29:30:21:52 brd ff:ff:ff:ff:ff:ff
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 100\    link/[65534] 
5: sit0: <NOARP> mtu 1480 qdisc noop \    link/sit 0.0.0.0 brd 0.0.0.0

Не все дистрибутивы поставляют /sbin/ip, который входит в пакет iproute2. Но это лучшее решение: ip намного приятнее ifconfig!

ephemient 29.10.2008 17:30

Поскольку пример OP относится к Bash, вот способ извлечения таких полей, как HWaddr, без использования дополнительных инструментов:

x=$(ifconfig eth0) && x=${x#*HWaddr } && echo ${x%% *}

На 1-м шаге это назначает вывод ifconfig переменной x. Второй шаг удаляет все, что было до "HWaddr". На последнем этапе все после "" (пробел за MAC) удаляется.

Ссылка: http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

Как насчет этого:

ifconfig eth0 | grep -Eo ..\(\:..\){5}

или более конкретно

ifconfig eth0 | grep -Eo [:0-9A-F:]{2}\(\:[:0-9A-F:]{2}\){5}

а также простой

ifconfig eth0 | head -n1 | tr -s ' ' | cut -d' ' -f5`

Можно сделать кота под /sys/class/

cat /sys/class/net/*/address

Специально для eth0

cat /sys/class/net/eth0/address

Это дает все адреса, а не только, например, для eth0.

MickeyfAgain_BeforeExitOfSO 08.05.2014 19:56

В openwrt cat / sys / class / net / eth0 / address работает неплохо: "cat / sys / class / net / eth0 / address" дает "c2: ee: 1e: 08: e6: 39" Примечание eth0 связывает вас с расположение оборудования: "cd / sys / class / net / eth0 /" изменяет cwd на "/sys/devices/platform/ag71xx.0/net/eth0/"

NULL pointer 09.07.2015 12:23

Для хранения в переменной: MacAdd=`cat /sys/class/net/eth0/address`.

haccks 18.08.2016 10:43

Я предпочитаю метод, описанный здесь (с небольшими изменениями): http://www.askdavetaylor.com/how_do_i_figure_out_my_ip_address_on_a_mac.html

ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d " " -f2

Затем вы можете использовать псевдоним короткой команды myip для использования в будущем:

echo "alias myip=\"ifconfig | grep 'inet ' | grep -v 127.0.0.1 | cut -d ' ' -f2\"" >> ~/.bash_profile

Примечание: в OS X eth0 может не работать. Используйте p2p0:

ifconfig p2p0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

интерфейс на моем Mac-сервере - en0, поэтому p2p0 не всегда работает

Dukeatcoding 07.09.2012 13:43

Это работает для меня на Mac OS X:

ifconfig en0 | grep -Eo ..\(\:..\){5}

Так делает:

ifconfig en0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

Оба являются вариациями приведенных выше примеров.

Вывод ifconfig:

$ifconfig

eth0      Link encap:Ethernet  HWaddr 00:1b:fc:72:84:12
      inet addr:172.16.1.13  Bcast:172.16.1.255  Mask:255.255.255.0
      inet6 addr: fe80::21b:fcff:fe72:8412/64 Scope:Link
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:638661 errors:0 dropped:20 overruns:0 frame:0
      TX packets:93858 errors:0 dropped:0 overruns:0 carrier:2
      collisions:0 txqueuelen:1000
      RX bytes:101655955 (101.6 MB)  TX bytes:42802760 (42.8 MB)
      Memory:dffc0000-e0000000

lo        Link encap:Local Loopback
      inet addr:127.0.0.1  Mask:255.0.0.0
      inet6 addr: ::1/128 Scope:Host
      UP LOOPBACK RUNNING  MTU:16436  Metric:1
      RX packets:3796 errors:0 dropped:0 overruns:0 frame:0
      TX packets:3796 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:0
      RX bytes:517624 (517.6 KB)  TX bytes:517624 (517.6 KB)

Лучший способ извлечь MAC-адрес:

ifconfig | sed '1,1!d' | sed 's/.*HWaddr //' | sed 's/\ .*//' | sed -e 's/:/-/g' > mac_address
ifconfig | grep -i hwaddr | cut -d ' ' -f11

Использовать:

ifconfig eth0 | grep HWaddr

или же

ifconfig eth0 |grep HWaddr

Будет извлечен только MAC-адрес и ничего больше.

Вы можете изменить свой MAC-адрес на все, что захотите:

ifconfig eth0 down,
ifconfig eth0 hw ether (new MAC address),
ifconfig eth0 up

HW, HWaddr не подходит для некоторых систем Linux / Unix, и он ничего не покажет.

amrx 05.05.2016 09:21

В Ubuntu 14.04 в терминале

ifconfig | grep HW

Хороший и быстрый:

ifconfig eth0 | grep HWaddr | cut -d ' ' -f 11

Мне нужно было получить MAC-адрес активного адаптера, поэтому я использовал эту команду.

ifconfig -a | awk '/^[a-z]/ { iface=$1; mac=$NF; next } /inet addr:/ { print mac }' | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'

Надеюсь, это поможет.

Для Ubuntu / Debian

ifconfig | grep HW | awk '{print $5}'

Для Rhat или CentOs попробуйте

ip add | grep link/ether | awk '{print $2}'

ifconfig en0 | grep ether - для проводного MAC-адреса

ifconfig en1 | grep ether - для беспроводного MAC-адреса

это сработало для меня

ifconfig eth0 | grep -o -E ..:..:..:..:..:..

вместо eth0 вы можете написать нужный вам интерфейс, это MAC-адрес

ifconfig en1 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}' 
  • Заменить «en1» на имя карты nic «eth0» или вообще удалить «en1» - простое и полезное решение.

Другие вопросы по теме