Como melhorar o desempenho na geração de endereços MAC com od?

0

No meu script, eu preciso gerar aleatoriamente endereços MAC. O código abaixo é de um script maior extraído, é por isso que o cálculo do endereço MAC está em uma função separada.

Isso funciona bem com o código abaixo. Embora quando executo o script, ele diminui bastante após vários endereços gerados.

Como posso melhorar a velocidade de gerar endereços MAC válidos?

#!/bin/bash

devicesCSVMacAddress="55:2d:fa:07" # <- fake MAC address prefix
devicesCSVFile=''

function mac_address() {
    line=''


    # ****************
    # This line below when I calculate a random mac address ending seems to be slow
    line+=$devicesCSVMacAddress$(od -txC -An -N2 /dev/random|tr \  :)
    # ****************


    devicesCSVFile+=$line'\n'
    date
}

for (( i=0; i<100; i++ ))
do
    mac_address
    echo $i
done

echo -e $devicesCSVFile > devices.csv

Eu usei a ferramenta od como descrito nesta resposta: Como gerar um endereço MAC aleatório válido com o bash shell .

    
por Bruno Bieri 14.11.2016 / 13:21

3 respostas

3

Use /dev/urandom ! Não há quase nenhum bom motivo para usar /dev/random em vez de /dev/urandom - veja Mitos sobre o urandom ou Quando usar / dev / random vs / dev / urandom - e certamente não quando você vai publicar os números gerados em todo o lugar.

/dev/random consome entropia, bloqueia e aguarda, se não estiver disponível o suficiente. /dev/urandom nunca bloqueia.

    
por 15.11.2016 / 12:54
2

Isso evitará a duplicação, mantendo a aleatoriedade desejada

prefix='55:2a:fa:07'
while :
do
    echo $prefix$(od -txC -An -N2 /dev/urandom | tr ' ' :)
done |
    awk '!h[$0]++ {print $0; ONR++} ONR>100 {exit}' >devices.csv

A construção awk mantém o controle das linhas que já são vistas e gera apenas aquelas que não foram vistas antes. Quando tem saídas de 100 linhas sai e o loop pára.

    
por 15.11.2016 / 12:57
2

com zsh :

#! /bin/zsh -
prefix=55:2d:fa:07

(){
  local LC_ALL=C
  IFS= read -ru0 -k2 a < /dev/urandom
  printf '%s:%02x:%02x\n' "$prefix" \'${^(s::)a}
}

Somente usaria os recursos internos. Os recursos específicos do zsh são:

  • ele pode lidar com bytes NUL em suas variáveis (ao contrário de todos os outros shells)
  • (){...} : função anônima (aqui usada para o escopo local de LC_ALL).
  • read -k2 : leia dois caracteres (aqui bytes com LC_ALL = C). ksh93 e bash agora têm -N para isso. Você precisa de -u0 (o mesmo que ksh ) para -k para não significar as teclas do teclado.
  • O sinalizador de expansão do parâmetro (s::) a dividir (aqui na sequência vazia é dividido nos caracteres individuais).
  • $^array : distribui essa expansão de array, então torna-se 'x 'y .
  • o comando printf é padrão aqui, incluindo a parte 'x para obter o valor codepoint para um caractere.
por 15.11.2016 / 13:18