Debo felicitar a @ rubo77 arriba por una respuesta de caparazón puro (a menos que cuentes con printf) arriba, que estaba buscando.
Esto agrega un poco de sed a:
(a) eliminar cualquier cero inicial en cada fragmento de 16 bits; y
(b) elimine cualquier fragmento adicional de cero al comienzo del IID
... según convenciones comunes para la brevedad de la dirección.
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/'
}
Tenga en cuenta que si desea reutilizar esto para otros prefijos (arbitrarios), lo que podría hacer ya que EUI-64 puede usarse en cualquier ámbito (aunque se recomienda no usarlo para direcciones globales por razones de privacidad), necesitaría un poco guión sed más complicado. Esto se debe a que el fe80::
prefijo ya contiene tres pedazos cero (eluidos al doble punto) adyacentes al inicio del IID. Por lo tanto, incluso si el primer fragmento del IID son todos ceros (es decir, si el MAC comenzó con 02:00
), también se eliminaría. El formato EUI-64 solo deja un fragmento adicional que podría ser todo cero, el último, que el script anterior agrega nuevamente como un solo cero. Otros prefijos pueden requerir que uno deje un solo cero entre dos puntos.