Я повинен дати kudos на @ rubo77 вище для чистої оболонки (якщо ви не рахуєте printf) відповіді вище, яку я шукав.
Це додає трохи sed до:
(a) вилучити будь-які провідні нулі у кожному 16-бітовому фрагменті; і
(b) ухиляються від будь-яких подальших цілих нульових фрагментів на початку 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 залишає лише ще один шматок, який міг би бути абсолютно нульовим - останній - який сценарій вище додає як єдиний нуль. Іншим префіксам може знадобитися один, щоб залишити один нуль між двома двокрапками.