Métodos eficientes para criar senhas seguras no terminal Linux utilizando Bash. As técnicas abaixo combinam diferentes ferramentas para gerar senhas contendo letras, números e caracteres especiais.
/dev/urandom com trEste método é simples e amplamente utilizado por sua segurança e facilidade.
head /dev/urandom | tr -dc 'A-Za-z0-9!@#$%^&*()' | head -c 20 ; echo
Ou, para incluir uma gama maior de caracteres especiais:
head /dev/urandom | tr -dc '[:alnum:][:punct:]' | head -c 20 ; echo
Explicação:
head /dev/urandom: lê uma quantidade de dados aleatórios.tr -dc 'A-Za-z0-9!@#$%^&*()': filtra os caracteres para incluir letras, números e alguns símbolos.tr -dc '[:alnum:][:punct:]': filtra caracteres alfanuméricos e de pontuação para mais variedade.head -c 20: define o comprimento da senha para 20 caracteres (pode ser ajustado).opensslO openssl também pode ser usado para gerar senhas seguras com dados criptograficamente fortes.
openssl rand -base64 24 | tr -dc '[:alnum:][:punct:]' | head -c 20 ; echo
Explicação:
openssl rand -base64 24: gera 24 bytes de dados aleatórios codificados em Base64.tr -dc '[:alnum:][:punct:]': filtra para incluir apenas caracteres alfanuméricos e de pontuação.head -c 20: define o comprimento da senha.Você pode gerar senhas únicas usando a data e hora atuais em conjunto com dados aleatórios.
parte1=$(date +%s%N) # Segundos e nanossegundos desde 1970
parte2=$(openssl rand -base64 10 | tr -dc '[:alnum:][:punct:]')
senha="${parte1:0:10}$parte2"
echo $senha
Explicação:
date +%s%N: gera um valor com a hora atual em segundos e nanossegundos.openssl rand -base64 10: gera dados aleatórios adicionais.tr -dc '[:alnum:][:punct:]': filtra para incluir os caracteres desejados.shufEste método cria senhas embaralhando palavras ou caracteres.
palavras=('Casa' 'Carro' 'Livro' 'Árvore' 'Sol')
senha=$(printf "%s" "${palavras[@]}" | fold -w1 | shuf | tr -d '\n' | head -c 20 ; echo)
echo $senha
Explicação:
printf "%s" "${palavras[@]}": imprime todas as palavras sem espaços entre elas.fold -w1: dobra a string para que cada caractere apareça em uma nova linha.shuf: embaralha os caracteres.head -c 20: define o tamanho da senha para 20 caracteres.pwgen (pacote externo)# Instalação: sudo apt-get install pwgen (Debian/Ubuntu)
pwgen -s 20 1 # Gera uma senha segura de 20 caracteres
/dev/randomhead -c 32 /dev/random | base64 | tr -dc '[:alnum:][:punct:]' | head -c 20
python3 -c "import secrets, string; print(''.join(secrets.choice(string.ascii_letters + string.digits + '!@#$%^&*') for i in range(20)))"
A função Bash original foi convertida em um script autônomo, que pode ser instalado globalmente no sistema. O script oferece diversas opções, como escolha do comprimento, quantidade, tipos de caracteres, métodos de hash, cópia para a área de transferência e salvamento em arquivo com permissões seguras.
Crie o diretório para seus scripts (se ainda não existir):
mkdir -p ~/workspace-as-code/scripts
Crie o arquivo do script e torne-o executável:
touch ~/workspace-as-code/scripts/gerar-senhas
chmod +x ~/workspace-as-code/scripts/gerar-senhas
Edite o arquivo com seu editor favorito e cole o conteúdo abaixo.
gerar-senhas#!/usr/bin/env bash
# ======================================================================
# Script: gerar-senhas
# Descrição: Gera senhas seguras no terminal Linux com diversos métodos
# Autor: Baseado na função bash do usuário
# Versão: 2.0 (adaptado para script)
# ======================================================================
# --- Cores para output ---
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# --- Funções de log ---
_info() { echo -e "${BLUE}[INFO]${NC} $*"; }
_warn() { echo -e "${YELLOW}[WARN]${NC} $*"; }
_error() { echo -e "${RED}[ERRO]${NC} $*" >&2; }
_success(){ echo -e "${GREEN}[SUCESSO]${NC} $*"; }
# ======================================================================
# Função principal
# ======================================================================
gerar_senha() {
# Valores padrão
local comprimento=20
local usar_simbolos=true
local quantidade=1
local apenas_hex=false
local metodo="random"
local mostrar_senha=false
local copiar_clipboard=false
local arquivo_saida=""
# Limites de segurança
local COMPRIMENTO_MAX=256
local QUANTIDADE_MAX=100
# Função auxiliar para gerar conjunto de caracteres
_gerar_caracteres() {
if [ "$apenas_hex" = true ]; then
echo '0-9A-F'
elif [ "$usar_simbolos" = true ]; then
echo 'A-Za-z0-9!@#$%^&*()_+-=[]{}|;:,.<>?'
else
echo 'A-Za-z0-9'
fi
}
# Função para limpeza de variáveis sensíveis
_limpar_variaveis_sensiveis() {
unset senha senha_gerada caracteres
}
# Trap para garantir limpeza mesmo em caso de erro
trap '_limpar_variaveis_sensiveis' RETURN
# Mostrar ajuda
mostrar_ajuda() {
cat << EOF
Uso: gerar-senhas [OPÇÕES]
Opções:
-c, --comprimento N Define o comprimento da senha (padrão: 20, máx: 256)
-q, --quantidade N Gera N senhas (padrão: 1, máx: 100)
-s, --sem-simbolos Gera senha apenas com letras e números
-x, --hexadecimal Gera senha hexadecimal (0-9, A-F)
-m, --metodo METODO Método de geração: random, mkpasswd, openssl, openssl-rand (padrão: random)
-S, --mostrar-senha Mostra a senha em claro quando usando mkpasswd ou openssl
-C, --clipboard Copia a última senha gerada para clipboard (requer xclip)
-f, --arquivo ARQUIVO Salva as senhas em arquivo (com permissões 600)
-h, --help Mostra esta ajuda
Exemplos:
gerar-senhas # Gera uma senha de 20 caracteres com símbolos
gerar-senhas -c 16 -q 3 # Gera 3 senhas de 16 caracteres
gerar-senhas --sem-simbolos # Gera senha apenas com letras e números
gerar-senhas --hexadecimal # Gera senha hexadecimal
gerar-senhas --metodo mkpasswd # Gera o hash de uma senha aleatória usando mkpasswd
gerar-senhas --metodo openssl -S # Gera o hash e mostra a senha em claro
gerar-senhas -c 32 -C # Gera senha de 32 caracteres e copia para clipboard
gerar-senhas -q 5 -f senhas.txt # Gera 5 senhas e salva em arquivo
Métodos disponíveis:
random - Geração aleatória pura (mais rápido, ideal para uso geral)
mkpasswd - Hash SHA-512 (ideal para /etc/shadow)
openssl - Hash SHA-512 via openssl (alternativa a mkpasswd)
openssl-rand - Geração via openssl rand -base64 (compatível com base64)
EOF
}
# --- Processar argumentos ---
while [[ $# -gt 0 ]]; do
case $1 in
-c|--comprimento)
if [ -z "$2" ]; then
_error "Opção $1 requer um valor"
return 1
fi
if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then
comprimento="$2"
shift 2
else
_error "Comprimento deve ser um número positivo"
return 1
fi
;;
-q|--quantidade)
if [ -z "$2" ]; then
_error "Opção $1 requer um valor"
return 1
fi
if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then
quantidade="$2"
shift 2
else
_error "Quantidade deve ser um número positivo"
return 1
fi
;;
-s|--sem-simbolos)
usar_simbolos=false
shift
;;
-x|--hexadecimal)
apenas_hex=true
shift
;;
-m|--metodo)
if [ -z "$2" ]; then
_error "Opção $1 requer um valor"
return 1
fi
case "$2" in
random|mkpasswd|openssl|openssl-rand)
metodo="$2"
shift 2
;;
*)
_error "Método deve ser: random, mkpasswd, openssl ou openssl-rand"
return 1
;;
esac
;;
-S|--mostrar-senha)
mostrar_senha=true
shift
;;
-C|--clipboard)
copiar_clipboard=true
shift
;;
-f|--arquivo)
if [ -z "$2" ]; then
_error "Opção $1 requer um valor"
return 1
fi
arquivo_saida="$2"
shift 2
;;
-h|--help)
mostrar_ajuda
return 0
;;
*)
_error "Opção desconhecida: $1"
mostrar_ajuda
return 1
;;
esac
done
# --- Validações ---
if [ "$comprimento" -gt "$COMPRIMENTO_MAX" ]; then
_error "Comprimento máximo permitido: $COMPRIMENTO_MAX caracteres"
return 1
fi
if [ "$quantidade" -gt "$QUANTIDADE_MAX" ]; then
_error "Quantidade máxima permitida: $QUANTIDADE_MAX senhas"
return 1
fi
# Verificar dependências
if [ "$metodo" = "mkpasswd" ] && ! command -v mkpasswd >/dev/null 2>&1; then
_error "O comando 'mkpasswd' não está instalado. Instale com: sudo apt install whois"
return 1
fi
if [[ "$metodo" = "openssl" || "$metodo" = "openssl-rand" ]] && ! command -v openssl >/dev/null 2>&1; then
_error "O comando 'openssl' não está instalado."
return 1
fi
if [ "$copiar_clipboard" = true ] && ! command -v xclip >/dev/null 2>&1; then
_warn "O comando 'xclip' não está instalado. Clipboard será desativado."
copiar_clipboard=false
fi
# Validar arquivo de saída
if [ -n "$arquivo_saida" ]; then
if ! touch "$arquivo_saida" 2>/dev/null; then
_error "Não foi possível criar/acessar o arquivo: $arquivo_saida"
return 1
fi
chmod 600 "$arquivo_saida"
fi
# Informar método
case "$metodo" in
random) _info "Gerando senha com método aleatório..." ;;
mkpasswd) _info "Gerando hash com mkpasswd (SHA-512)..." ;;
openssl) _info "Gerando hash com openssl (SHA-512)..." ;;
openssl-rand) _info "Gerando senha com openssl rand..." ;;
esac
# --- Geração das senhas ---
local ultima_senha=""
for ((i=1; i<=quantidade; i++)); do
if [ "$quantidade" -gt 1 ]; then
echo -e "${CYAN}--- Senha $i ---${NC}"
fi
local senha
local senha_gerada
case "$metodo" in
random)
local caracteres
caracteres=$(_gerar_caracteres)
if ! senha=$(head -c 1024 /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento"); then
_error "Falha ao gerar senha"
return 1
fi
;;
openssl-rand)
local bytes_necessarios=$((comprimento * 3 / 4 + 1))
if ! senha=$(openssl rand -base64 "$bytes_necessarios" 2>/dev/null | tr -d '\n/+=' | head -c "$comprimento"); then
_error "Falha ao gerar senha com openssl rand"
return 1
fi
;;
mkpasswd|openssl)
local caracteres
caracteres=$(_gerar_caracteres)
if ! senha_gerada=$(head -c 1024 /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento"); then
_error "Falha ao gerar senha"
return 1
fi
if [ -z "$senha_gerada" ]; then
_error "Falha ao gerar senha"
return 1
fi
case "$metodo" in
mkpasswd)
if ! senha=$(mkpasswd -m SHA-512 "$senha_gerada" 2>/dev/null); then
_error "Falha ao gerar hash com mkpasswd"
return 1
fi
;;
openssl)
if ! senha=$(openssl passwd -6 "$senha_gerada" 2>/dev/null); then
_error "Falha ao gerar hash com openssl"
return 1
fi
;;
esac
if [ "$mostrar_senha" = true ]; then
echo -e "${GREEN}Senha: ${senha_gerada}${NC}"
fi
;;
esac
if [ -z "$senha" ]; then
_error "Falha ao gerar senha"
return 1
fi
echo -e "${GREEN}${senha}${NC}"
if [ -n "$arquivo_saida" ]; then
echo "$senha" >> "$arquivo_saida"
fi
ultima_senha="$senha"
if [ "$quantidade" -gt 1 ] && [ "$i" -lt "$quantidade" ]; then
echo
fi
done
# Copiar para clipboard se solicitado
if [ "$copiar_clipboard" = true ] && [ -n "$ultima_senha" ]; then
if echo -n "$ultima_senha" | xclip -selection clipboard 2>/dev/null; then
_success "Última senha copiada para clipboard"
else
_warn "Falha ao copiar para clipboard"
fi
fi
# Informações finais
if [ -n "$arquivo_saida" ]; then
_success "Senhas salvas em: $arquivo_saida (permissões: 600)"
fi
if [ "$comprimento" -lt 12 ]; then
_warn "Recomendação: Use senhas com pelo menos 12 caracteres para melhor segurança"
fi
if [[ "$metodo" == "mkpasswd" || "$metodo" == "openssl" ]]; then
_info "Use este hash em arquivos de configuração como /etc/shadow"
fi
_limpar_variaveis_sensiveis
}
# ======================================================================
# Chamada principal
# ======================================================================
gerar_senha "$@"
exit $?
Para poder executar o script de qualquer lugar, crie um link simbólico em /usr/local/bin:
sudo ln -s ~/workspace-as-code/scripts/gerar-senhas /usr/local/bin/gerar-senhas
Verifique se o link foi criado corretamente:
ls -l /usr/local/bin/gerar-senhas
Agora você pode chamar o comando gerar-senhas diretamente:
gerar-senhas --help
gerar-senhas -c 16 -q 3
gerar-senhas --metodo mkpasswd -S
gerar-senhas -c 32 -C # copia para clipboard (requer xclip)
gerar-senhas -q 5 -f minhas_senhas.txt
/dev/urandom e openssl, fontes de entropia confiáveis.--clipboard é necessário ter o xclip instalado (sudo apt install xclip no Debian/Ubuntu).mkpasswd requer o pacote whois (que fornece o comando mkpasswd).-f é criado com permissões 600 (apenas leitura/escrita para o proprietário).Esses métodos cobrem uma ampla gama de abordagens para gerar senhas seguras diretamente no terminal Linux, usando ferramentas padrão como Bash. Escolha o método que melhor se adapta à sua necessidade de segurança e ajuste conforme necessário:
/dev/random.