Como posso gerar um endereço mac aleatório válido com bash.
A primeira metade do endereço deve sempre permanecer a mesma assim
00-60-2F-xx-xx-xx
apenas o valor x deve ser gerado aleatoriamente?
bash
mac-address
NES
fonte
fonte
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'
Respostas:
Aqui está um peixe.
Este script de shell irá gerar a sequência aleatória que você procura:
Eu tinha apenas algo aqui que mostrava como executá-lo a partir da linha de comando, mas depois de olhar para a solução complicada (mas votada) de Dennis Williamson, vejo que a resposta que as pessoas esperam é aquela em que não precisam fazer nenhum trabalho si mesmos.
fonte
Ou em python:
Observe que a versão python usa apenas um campo amplo de 16 para gerar um caractere hexadecimal, portanto você não precisa se preocupar com o preenchimento zero - abordagem alterada para abordar um comentário.
fonte
00-60-2F-8B-5-2C
,00-60-2F-A-71-97
,00-60-2F-82-F1-4
.No passado, eu fiz isso usando:
mas isso só os fará no intervalo de 0 a 9. Para meus propósitos, isso foi bom o suficiente.
Provavelmente, uma solução melhor seria usar printf:
Veja como isso funciona:
fonte
%02X
daria uma letra maiúscula.Usando ferramentas padrão,
ou
pode ser o mais curto de todos.
fonte
As chaves para a maneira como isso funciona:
LC_CTYPE=C
- permite caracteres> 0x7FIFS=
- desativa a interpretação de\t
(tab),\n
(nova linha) e espaço-d ''
- permite novas linhas-r
permite\
(e quase sempre deve ser usado por hábitoread
)-%02x\n
faz com que a saída seja um hífen literal seguido por um número hexadecimal de dois dígitos, incluindo um zero à esquerda, se apropriado. A nova linha é supérflua aqui e pode ser omitida.read
recebe um único byte (-n 1
) a partir/dev/urandom
da escala de 0 a 255 (00
aFF
).A citação simples no último argumento para o
printf
loop faz com que o caractere seja exibido como seu valor numérico ("A" é exibido como "65"). Veja a especificação POSIX paraprintf
onde diz:fonte
IFS= read …
de evitar dobrar 09 0a e 20 (os caracteres IFS usuais) em 00.-d ''
. Eu vou consertar minha resposta. Obrigado por me avisar.-r
que protege `\` caiu. Desejo que o tratamento adequado de dados binários em programas shell não seja tão complicado. Impossible Parece impossível representar com precisão 00 no meio da string. Seu método de caractere único por vez lida com 00 em virtude da cooperação conveniente (projetada?) Entre aread
interpolação de cadeias e comoprintf
trata o argumento de um caractere'
. Suspiro.hexdump -C
.A maneira mais curta que eu pude pensar foi usando o hexdump diretamente
Testado no GNU / Linux
fonte
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
é um pouco mais curto :-)Outra solução de uma linha
Mesma coisa em maiúsculas
Gere-o para uma variável de ambiente Bash
Detalhes:
od (despejo octal)
-An
Suprime a representação do endereço principal (ruído extra) da saída.-N3
Limite a saída para três bytes.-t xC
Saída em hexadecimal, estilo de caractere ASCII, conforme desejado./dev/urandom
Pseudo-arquivo de número aleatório do kernel do Linux.sed (editor de fluxo) Para espaço para hífen em substituição.
-e <SCRIPT>
execute o script sed.tr (tradução de string) Opcional, neste exemplo. Eu gosto de endereços MAC em maiúsculas nos meus scripts / ambiente.
fonte
fonte
Isso deve funcionar
fonte
fonte
Este também funciona. A saída está em letras maiúsculas, conforme necessário.
fonte
Isso funciona no
#!/bin/sh
script shell ( ) clássico :Ou, se você deseja ter um prefixo personalizado:
Exemplo de uso:
fonte
Outra opção é usar
jot
:-w
muda o formato,-s
altera o separador e-r
gera números aleatórios.Os comandos usados
od
nas respostas postadas por artistoex e zero2cx adicionam traços extras à saída com OS Xod
, mas isso não:OS X
od
(/usr/bin/od
abaixo) usa um formato de saída diferente do GNUod
:fonte
jot -w%02X -s- -r 3 1 256
parajot -w%02X -s- -r 3 0 256
.No Linux:
Explicação:
No Linux,
/proc/sys/kernel/random/uuid
retorna um novo UUID do tipo 4 (aleatório) toda vez que você o lê. A maioria de seus caracteres é (pseudo) dígitos hexadecimais aleatórios, portanto, podemos usá-los. Por exemplo:Agora basta imprimir
00-60-2f-
(sem nova linha) primeiro:Prós:
printf
ecut
são ferramentas POSIX;Contras:
/proc/sys/kernel/random/uuid
pode não estar disponível em alguns sistemas;fonte
Um forro (bash)
resultado
fonte