Geração de Strings Aleatórias em Shell Script

Existem diversas abordagens para gerar strings aleatórias em um ambiente de shell. Abaixo, exploramos alguns métodos comuns e eficientes.

  1. 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
  1. 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
  1. 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
  1. 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
  1. Utilizando a Função rand() do awk

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}'
  1. Aproveitando /dev/random e /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
  1. 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

Tags: shell Bash gerador de string aleatória openssl mkpasswd

Publicado em 6-11 03:33 por Thomas