Я должен отдать дань уважения @ rubo77 выше за чистый ответ (если не считать printf) выше, который я искал.
Это добавляет немного sed к:
(а) исключить любые начальные нули в каждом 16-битном фрагменте; и
(б) исключить любые дополнительные нулевые фрагменты в начале IID
... в соответствии с общими соглашениями для краткости адреса.
mac_to_eui64() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}
Обратите внимание, что если вы хотите переназначить это для других (произвольных) префиксов, которые вы могли бы использовать, так как EUI-64 может использоваться в любой области (хотя рекомендуется не использовать его для глобальных адресов из соображений конфиденциальности), вам потребуется немного более замысловатый сценарий sed. Это связано с тем, что fe80::
префикс уже содержит три нулевых блока (исключенных из двойного двоеточия) рядом с началом IID. Таким образом, даже если первый блок IID имеет все нули (то есть, если MAC начался с 02:00
), он также будет исключен. Формат EUI-64 оставляет только один дополнительный фрагмент, который может быть полностью нулевым, - последний - который сценарий выше добавляет обратно в качестве единого нуля. Для других префиксов может потребоваться оставить один ноль между двумя двоеточиями.