Volta e meia tenho que gerar senhas aleatórias e em algumas vezes, existe alguma limitação de “caracteres”, como senhas decimais, hexadecimais, alfanuméricos sem símbolos, …

Geralmente recorro a soluções diversas encontradas pela rede, mas na última vez que tive que gerar uma senha hexadecimal, achei que já era hora de criar uma solução personalizada.

O Bash Script apresentado a segui gera senhas, sorteando caracteres predefinidos de uma string. Sei que a idéia não é original, se é que alguma pode ser original em programação atualmente, mas achei que ficou bem simples e elegante.

Como funciona

O Script deve ser colocado em um diretório que esteja definido em sua variável PATH, algo como /usr/bin ou /usr/local/bin. Este último acho mais conveniente.

Todas as opções do Script podem ser conhecidas comandando apenas “senhas”:

senhas
senhas <number_of_bytes> <type>
  where type is:
    hexadecimal or hex
    decimal     or dec
    octal       or oct
    binarie     or bin
    alfanumeric or alf
    symbols     or sym
    string enter

Ou seja, você deve passar dois argumentos para o gerador de senhas. O primeiro é o número de caracteres que devem ser gerados. O segundo é o tipo de senha que deve ser gerado:

  • hex – para hexadecimal
  • dec – para decimal
  • oct – para octal
  • bin – para binário
  • alf – para alfanumérico (apenas letras em minúsculo)
  • sym – para letras, números e simbolos
  • string – aqui você pode entrar com uma string qualquer, onde a senha será gerada sorteando os caracteres desta string

Alguns Exemplos:

Gera uma senha com 12 caracteres alfanuméricos:

senhas 12 alf
kxggsl6xgzo9

Gera uma senha WPA. Código de 64 caracteres em hexadecimal:

senhas 64 hex
44dd3fe6fa7ba3a8356f36005ff69fb67e49321464fc6f6baea0026ab683d4dc

Gera uma senha com 6 caracters com as vogais:

senhas 6 aeiouAEIOU
iuIaEi

O Script senhas

#!/bin/bash
#
# Gerador de senhas
PROGRAM=`basename $0`

function senha_help {

  echo "$PROGRAM <number_of_bytes><type>
  where type are:
    hexadecimal or hex
    decimal     or dec
    octal       or oct
    binarie     or bin
    alfanumeric or alf
    symbols     or sym
    string enter"
  exit 1
}

if [ $# -ne 2 ]; then
  senha_help
fi

case $2 in
  'hexadecimal'|'hex')
    STRING='0123456789abcdef'
  ;;
  'decimal'|'dec')
    STRING='0123456789'
  ;;
  'octal'|'oct')
    STRING='01234567'
  ;;
  'binarie'|'bin')
    STRING='01'
  ;;
  'alfanumeric'|'alf')
    STRING='0123456789abcdefghijklmnopqrstuvxywz'
  ;;
  'symbols'|'sym')
    STRING='0123456789abcdefghijklmnopqrstuvxywzABCDEFGHIJKLMNOPQRSTUVXYWZ!@#$%^&*()_+-=[]{}|;:",./<>?~`'
  ;;
  *)
    STRING="$2"
  ;;
esac

BASE=`echo -n $STRING | wc -c`

for i in $( seq 1 $1 ); do 
  N=$(( $RANDOM % $BASE + 1 ))
  echo $STRING | cut -c$N
done | tr -d '\012'
echo