Devo dar os parabéns ao @ rubo77 acima para obter uma resposta de shell puro (a menos que você conte printf) acima, o que eu estava procurando.
Isso adiciona um pouco de sed a:
(a) elimine quaisquer zeros à esquerda em cada pedaço de 16 bits; e
(b) eliminar quaisquer outros pedaços totalmente zero no início do DIC
... conforme convenções comuns para a brevidade do endereço.
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/'
}
Observe que, se você desejar refazê-lo para outros prefixos (arbitrários), que podem ser usados em EUI-64 em qualquer escopo (embora seja recomendável não usá-lo para endereços globais por razões de privacidade), você precisará de um pouco script sed mais complicado. Isso ocorre porque o fe80::
prefixo já contém três blocos de zero (elididos ao dois-pontos) adjacentes ao início do IID. Portanto, mesmo que o primeiro pedaço do IID seja totalmente zero (ou seja, se o MAC começou com 02:00
), ele também seria eliminado. O formato EUI-64 deixa apenas mais um pedaço que pode ser zero - o último - que o script acima adiciona novamente como um único zero. Outros prefixos podem exigir que um deixe um único zero entre dois pontos.