Как лучше всего извлечь 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 или что-то еще, и каковы достоинства и недостатки одного метода над другим.
@ Nabin: поле "HWaddr".





Не уверен, действительно ли есть какие-то преимущества, но вы можете просто использовать awk:
ifconfig eth0 | awk '/HWaddr/ {print $5}'
Используйте ip addr вместо ifconfig. ip addr | grep -C1 "link/ether" должен делать.
Я хотел бы использовать:
ifconfig eth0 | grep -o -E '([[:xdigit:]]{1,2}:){5}[[:xdigit:]]{1,2}'
-O заставит grep печатать только ту часть строки, которая соответствует выражению. [[:xdigit:]]{1,2} будет соответствовать 1 или 2 шестнадцатеричным цифрам (Solaris не выводит ведущие нули).
Какие? Это будет соответствовать независимо от размещения MAC-адреса, тогда как другие решения не будут.
У него есть то преимущество, что он также работает с OSX, поскольку ifconfig использует эфир вместо HWaddr.
Это было моим намерением, я работал с множеством разных Unix, и это единственное решение, которое будет работать на всех из них.
Я не понимаю отрицательного голоса, моя первоначальная мысль заключалась в том, что он чрезмерно спроектирован для работы, но он работает и лучше работает с немного другим выводом (я бы хотел поместить его в скрипт, чтобы мне не нужно было запоминать регулярное выражение).
Этот «grep -o» также является полезным дополнением к моим знаниям.
Существуют ли какие-либо UNICES, которые не выводят начальные нули для разделов MAC (что требует "{1,2}" вместо "{2}")?
Это лучший способ, который я видел. Это потому, что эта команда будет полезна не только с ifconfig, но и с любым другим источником MAC, например, с извлечением MACS Xen DomU с помощью xm network-list MACS ARP caché и т. д.
Я использовал ifconfig eth0 | grep -Eo '([[:xdigit:]]{1,2}[:-]){5}[[:xdigit:]]{1,2}' | head -n1 для компенсации устройств, которые содержат «-» вместо «:» и / или сообщают более 6 байтов.
Мне нравится использовать / 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!
Поскольку пример 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.
В 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/"
Для хранения в переменной: MacAdd=`cat /sys/class/net/eth0/address`.
Я предпочитаю метод, описанный здесь (с небольшими изменениями): 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 не всегда работает
Это работает для меня на 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, и он ничего не покажет.
В 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}'
Какой из них MAC-адрес?