Script para endereço MAC aleatório

Iniciado por reynaldohortensi, 27 de Setembro de 2014, 22:46

tópico anterior - próximo tópico

reynaldohortensi

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