Converte o endereço MAC para o endereço local do link com o bash

5

Como posso converter um endereço Mac em um endereço IPV6 Link-Local?

você precisa adicionar fe80:: no início e inserir ff:fe no meio

além disso, todos os zeros iniciais devem ser removidos

    
por rubo77 14.06.2013 / 00:48

3 respostas

5

Você pode usar IFS para dividir o endereço MAC em 6 grupos separados por dois pontos e montá-los. Você também precisará virar o 7º bit mais significativo (obrigado bahamat ), ou seja, bit 1 do primeiro byte.

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

Você pode usar as construções de remoção de prefixo e sufixo ${VAR#PREFIX} and ${VAR%SUFFIX} para cortar o endereço MAC em partes.

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##*:}
}

Você pode usar a construção de substring (somente bash, não 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}"
}
    
por 14.06.2013 / 01:39
3

Tomando a explicação de Gilles, mas corretamente invertendo o sétimo bit conforme a especificação 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}

Exemplo de inversão de bits:

$ mac_to_ipv6 00:00:00:00:00:00
fe80::200:00ff:fe00:0000
    
por 14.06.2013 / 08:18
0

Você pode criar uma função que use IFS para dividir o endereço MAC em 6 grupos separados por dois pontos e montá-los. Você também precisará virar o 7º bit mais significativo (obrigado bahamat), ou seja, bit 1 do primeiro byte:

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

Exemplo de uso:

$ mac_to_ipv6_ll 12:34:56:78:90:12
fe80::1034:56ff:fe78:9012
    
por 12.12.2018 / 16:14