Intereting Posts
Предоставление OVZ контейнеров своим собственным IP Заменить определенный текст в фигурных скобках Поиск файлов по кодировке символов bash: не блокирование чтения внутри цикла Как преобразовать несколько изображений tiff в координаты xyz в одном текстовом файле с помощью терминала? Является ли историческое поведение команды Unix V5 tr дополнением set2 отличным от того, что мы считаем сегодня «классическим» поведением System V (1983-1988)? rsync от Mac ext hd до VPS работает, но не VPS для Mac Диспетчеру дисплея mdm не удается загрузить среду рабочего стола Начать X в Debian Wheezy Перезапуск службы systemd при сбое зависимости Фильтрация или обтекание определенных разделов файла Как включить дополнительное ведение журнала аудита? Ранее разрешенные имена хостов Зачем мне нужны initramfs? Получение «нет такого файла или каталога», хотя файл явно присутствует

Преобразование MAC-адреса в локальный адрес ссылки с помощью bash

Как конвертировать Mac-адрес в адрес ipv6 Link-Local?

вы должны добавить fe80:: в начале и вставить ff:fe в середине

кроме того, все ведущие нули должны быть разделены

Вы можете использовать IFS для разделения MAC-адреса на шесть разделенных двоеточиями групп и их сборки. Вам также потребуется перевернуть 7-й самый старший бит (спасибо bahamat ), то есть бит 1 первого байта.

 mac_to_ipv6 () { IFS=':'; set $1; unset IFS ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" } 

Вы можете использовать префикс и дескрипторы дескриптора ${VAR#PREFIX} и ${VAR%SUFFIX} чтобы вырезать MAC-адрес на куски.

 mac_to_ipv6 () { mac=$1 ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2))) mac=${mac#*:} ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe mac=${mac#*:*:} ipv6_address=$ipv6_address${mac%:*}${mac##*:} } и mac_to_ipv6 () { mac=$1 ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2))) mac=${mac#*:} ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe mac=${mac#*:*:} ipv6_address=$ipv6_address${mac%:*}${mac##*:} } 

Вы можете использовать конструкцию подстроки (только bash, а не sh).

 mac_to_ipv6 () { local mac=$1 byte0 printf %02x -v byte0 $((0x${mac:0:2} ^ 2)) ipv6_address="fe80::$byte0${mac:3:5}ff:fe${mac:9:5}${mac:15:2}" } и mac_to_ipv6 () { local mac=$1 byte0 printf %02x -v byte0 $((0x${mac:0:2} ^ 2)) ipv6_address="fe80::$byte0${mac:3:5}ff:fe${mac:9:5}${mac:15:2}" } 

Взяв объяснение Жиля, но правильно перевернув 7-й бит в соответствии со спецификацией IPv6 :

 #!/bin/bash IFS=':'; set $1; unset IFS printf "fe80::%x%x:%x:%x:%x\n" 0x$(( 0x${1} ^ 0x02 )) 0x${2} 0x${3}ff 0xfe${4} 0x${5}${6} 

Пример бит-листания:

 $ mac_to_ipv6 00:00:00:00:00:00 fe80::200:00ff:fe00:0000