Como vai gerar um endereço MAC válido e aleatório?

2

Você provavelmente sabe que o endereço MAC pode ser gerado, por exemplo, da seguinte maneira:

macaddr=$(dd if=/dev/random bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/:::::/')
echo $macaddr

Mas esse método pode resultar em um endereço MAC semelhante a este: 07:d4:51:9f:50:6c . Você simplesmente não pode usar o endereço . Se você tentou, você receberia este erro:

# ip link set dev wlan0 address $macaddr
RTNETLINK answers: Cannot assign requested address

Portanto, a linha acima deve ser reescrita. E a questão é como deve ser, de modo que o endereço MAC sempre seja válido?

    
por Mikhail Morfikov 29.04.2016 / 04:19

1 resposta

3
  1. extrair o primeiro byte (por exemplo, 07 do seu exemplo)
  2. bit a bit E com decimal 254 (11111110 - todos os bits, exceto zeroth bit set)
  3. bit a bit OR com decimal 2 (00000010 - somente conjunto de 1º bit)
  4. combine o primeiro byte com os últimos cinco bytes

por exemplo,

#! /bin/sh

mac='07:d4:51:9f:50:6c'

lastfive=$( echo "$mac" | cut -d: -f 2-6 )
firstbyte=$( echo "$mac" | cut -d: -f 1 )

# make sure bit 0 (broadcast) of $firstbyte is not set,
# and bit 1 (local) is set.
# i.e. via bitwise AND with 254 and bitwise OR with 2.

firstbyte=$( printf '%02x' $(( 0x$firstbyte & 254 | 2)) )

mac="$firstbyte:$lastfive"

echo "$mac"

Saída:

06:d4:51:9f:50:6c

07 hex é 00000111 binário. bit a bit AND-it com 254 ( 11111110 binary) resulta em 00000110 binary (6 decimal). bitwise OR-ing com 2 ( 00000010 binary) resulta em nenhuma mudança porque o bit 1 já está setado. O resultado final é 06 hex.

    
por 29.04.2016 / 05:31