Olá,
eu escrevi um script para mudar o endereço MAC de minha placa de rede para um valor aleatório. Foi um caminho relativamente longo.
Descobri pesquisando que os 6 primeiro dígitos do endereço não podem ser completamente aleatórios, pois denominam o fabricante da placa e algum roteadores (o meu) não aceitam valores inexistentes.
Inicialmente eu gerava endereços começando com 00, pois percebi que todos eles já existem, mas depois resolvi melhorar o script usando os dados que estão em
http://standards.ieee.org/develop/regauth/oui/oui.txt.
Ainda pretendo acrescentar funcionalidades ao script, como uma opção pra atualizar a lista de fabricantes e fazer do valor aleatório uma opção e não o comportamento padrão.
Ele deve ser executado como root e a sintaxe é: chmac <device>
Mas por enquanto é esse:
#!/bin/bash
# deve ser executado como root ou com o sudo
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi
# arquivos com dados dos fabricantes
BASE_FILE='/etc/oui.txt'
FILE='/etc/oui_trimmed.txt'
# baixa e formata o arquivo com os códigos dos fabricantes se ele ainda não existe
if [ ! -e $FILE ]
then
if [ ! -e $BASE_FILE ]
then
wget -O $BASE_FILE -c http://standards.ieee.org/develop/regauth/oui/oui.txt
fi
# o grep filtra as linhas, o awk separa apenas a primeira coluna,
# o sed troca os "-" por ":" e retira os espaços em branco do início da linha
grep ' (hex)' oui.txt | awk -F ' ' '{print $1}' | sed 's/-/:/g' | sed 's/ //g' >> $FILE
fi
# número de linhas do arquivo
OUI_MAX=$(wc -l < $FILE)
# escolhe uma linha aleatória
RANDOM_MANUFACTURER=$(((RANDOM % OUI_MAX)+1))
# guarda o código presente na linha aleatória
RANDOM_MANUFACTURER=$(head -n $RANDOM_MANUFACTURER $FILE | tail -1)
# coloca o código escolhido no começo do endereço
MAC=$RANDOM_MANUFACTURER
# valor máximo pra cada dígito (em decimal)
MAX=$((16**2))
# gera aleatóriamente os dígitos restantes
for x in 1 2 3; do
# gera um número aleatório entre 0 e 255
DIGIT=$((RANDOM % MAX))
# converte pra base hexadecimal
DIGIT=`echo "obase=16; $DIGIT" | bc`
# formata pra dois dígitos
DIGIT=`printf "%02x" 0x$DIGIT`
# adiciona no final do endereço
MAC=$MAC:$DIGIT
done
echo "O novo MAC será '$MAC'"
# configura o novo endereço MAC
service network-manager stop
ifconfig $1 down
ifconfig $1 hw ether $MAC
ifconfig $1 up
service network-manager start