Existem diversas abordagens para gerar strings aleatórias em um ambiente de shell. Abaixo, exploramos alguns métodos comuns e eficientes.
- Utilizando a Variável $RANDOM
A variável de ambiente $RANDOM gera um número inteiro pseudoaleatório entre 0 e 32767. Para obter números maiores ou strings, podemos combiná-la com outras ferramentas.
# Gera um número aleatório (exemplo: 23589)
echo $RANDOM
# Gera uma string aleatória de 10 caracteres usando MD5
echo $RANDOM | md5sum | head -c 10
# Alternativa com SHA512
echo $RANDOM | sha512sum | head -c 10
- Usando
openssl rand
O comando openssl rand é uma ferramenta poderosa para gerar bytes aleatórios. As opções -base64 e -hex permitem codificar a saída em Base64 ou hexadecimal, respectivamente.
# Gera 8 bytes aleatórios, codifica em Base64 e pega os primeiros 10 caracteres após hashing com SHA512
openssl rand -base64 8 | sha512sum | head -c 10
# Alternativa usando `cut` para selecionar os primeiros 10 caracteres
openssl rand -base64 8 | sha512sum | cut -c1-10
- Empregando
mkpasswd
O comando mkpasswd, geralmenet parte do pacote expect, pode gerar senhas aleatórias de um comprimento especificado.
# Instala o pacote expect (necessário para mkpasswd)
# sudo apt-get install expect # Para sistemas baseados em Debian/Ubuntu
# sudo yum -y install expect # Para sistemas baseados em Red Hat/CentOS
# Gera uma senha aleatória de 8 caracteres
mkpasswd -l 8
- Baseando-se no Tempo com
date
A data e hora atuais, especialmente com alta precisão, podem servir como uma fonte de aleatoriedade.
# Gera um timestamp com segundos e nanossegundos (ex: 1678886400123456789)
date +%s%N
# Extrai 8 dígitos do timestamp
date +%s%N | cut -c6-13
# Gera uma string aleatória de 8 caracteres alfanuméricos usando MD5 do timestamp
date +%s%N | md5sum | head -c 8
- Utilizando a Função
rand()doawk
O awk possui uma função rand() que pode ser usada para gerar números pseudoaleatórios.
# Gera um número aleatório entre 0 e 1, multiplicado por 1 milhão
awk 'BEGIN{srand(); print rand()*1000000}'
- Aproveitando
/dev/randome/dev/urandom
Os dispositivos de caractere /dev/random e /dev/urandom fornecem fontes de entropia do sistema. /dev/urandom é geralmente preferido para a maioria das aplicações por não ser bloqueante.
# Gera uma string aleatória de 10 caracteres a partir de /dev/urandom
cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 10
# Gera uma string aleatória mais longa, filtrando caracteres não alfanuméricos
cat /dev/urandom | sed -e 's/[^a-zA-Z0-9]//g' | strings -n 8 | head -n 1
# Gera um número inteiro pseudoaleatório a partir de /dev/urandom
# Lê 200 linhas de /dev/urandom, calcula um checksum e extrai o primeiro campo
head -n 200 /dev/urandom | cksum | cut -d" " -f1
# Gera uma string aleatória de 18 caracteres com símbolos permitidos
head -n 5 /dev/urandom | sed 's/[^0-9a-zA-Z!@#$%&*_+]//g' | tr -d '\n' | head -c 18
- Lendo o UUID do Kernel Linux
O kernel Linux expõe um UUID (Universally Unique Identifier) que é gerado de forma aleatória e pode ser lido do arquivo /proc/sys/kernel/random/uuid.
# Gera um número inteiro aleatório a partir do UUID do kernel
cat /proc/sys/kernel/random/uuid | cksum | cut -f1 -d" "
# Gera uma string aleatória de 8 caracteres alfanuméricos a partir do UUID do kernel
cat /proc/sys/kernel/random/uuid | md5sum | cut -c1-8