User Tools

Site Tools


wiki:linux:bash:make_password_bash

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
wiki:linux:bash:make_password_bash [2026/01/20 12:20] Wiki Administratorwiki:linux:bash:make_password_bash [2026/02/23 09:11] (current) Wiki Administrator
Line 19: Line 19:
 **Explicação**: **Explicação**:
   * **head /dev/urandom**: Lê uma quantidade de dados aleatórios.   * **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 '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.   * **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).   * **head -c 20**: Define o comprimento da senha para 20 caracteres (pode ser ajustado).
Line 94: Line 94:
  
 <code bash> <code bash>
-# Função gerar senha +# Função gerar_senha  
-# ~/.bash_functions - Função gerar_senha final+# ~/.bash_functions 
 +# Versão: 2.0 
 gerar_senha() { gerar_senha() {
     # Definir cores para output     # Definir cores para output
Line 118: Line 120:
     local metodo="random"     local metodo="random"
     local mostrar_senha=false     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
 +    # Evita duplicação de código (melhoria de qualidade)
 +    _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
 +    # Melhoria crítica de segurança
 +    _limpar_variaveis_sensíveis() {
 +        unset senha senha_gerada caracteres
 +    }
 +
 +    # Trap para garantir limpeza mesmo em caso de erro
 +    trap '_limpar_variaveis_sensíveis' RETURN
  
     # Mostrar ajuda     # Mostrar ajuda
Line 125: Line 154:
  
 Opções: Opções:
-  -c, --comprimento N    Define o comprimento da senha (padrão: 20) +  -c, --comprimento N    Define o comprimento da senha (padrão: 20, máx: 256
-  -q, --quantidade N     Gera N senhas (padrão: 1)+  -q, --quantidade N     Gera N senhas (padrão: 1, máx: 100)
   -s, --sem-simbolos     Gera senha apenas com letras e números   -s, --sem-simbolos     Gera senha apenas com letras e números
   -x, --hexadecimal      Gera senha hexadecimal (0-9, A-F)   -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)   -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   -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   -h, --help             Mostra esta ajuda
  
Line 140: Line 171:
   gerar_senha --metodo mkpasswd          # Gera o hash de uma senha aleatória usando mkpasswd   gerar_senha --metodo mkpasswd          # Gera o hash de uma senha aleatória usando mkpasswd
   gerar_senha --metodo openssl -S        # Gera o hash e mostra a senha em claro   gerar_senha --metodo openssl -S        # Gera o hash e mostra a senha em claro
-  gerar_senha --metodo openssl-rand      # Gera senha usando openssl rand -base64+  gerar_senha -c 32 -C                   # Gera senha de 32 caracteres e copia para clipboard 
 +  gerar_senha -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 EOF
     }     }
Line 148: Line 186:
         case $1 in         case $1 in
             -c|--comprimento)             -c|--comprimento)
 +                # Validação de argumento faltante (melhoria de robustez)
 +                if [ -z "$2" ]; then
 +                    _error "Opção $1 requer um valor"
 +                    return 1
 +                fi
                 if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then                 if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then
                     comprimento="$2"                     comprimento="$2"
Line 157: Line 200:
                 ;;                 ;;
             -q|--quantidade)             -q|--quantidade)
 +                # Validação de argumento faltante (melhoria de robustez)
 +                if [ -z "$2" ]; then
 +                    _error "Opção $1 requer um valor"
 +                    return 1
 +                fi
                 if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then                 if [[ $2 =~ ^[0-9]+$ ]] && [ "$2" -gt 0 ]; then
                     quantidade="$2"                     quantidade="$2"
Line 174: Line 222:
                 ;;                 ;;
             -m|--metodo)             -m|--metodo)
 +                # Validação de argumento faltante (melhoria de robustez)
 +                if [ -z "$2" ]; then
 +                    _error "Opção $1 requer um valor"
 +                    return 1
 +                fi
                 case "$2" in                 case "$2" in
                     random|mkpasswd|openssl|openssl-rand)                     random|mkpasswd|openssl|openssl-rand)
Line 188: Line 241:
                 mostrar_senha=true                 mostrar_senha=true
                 shift                 shift
 +                ;;
 +            -C|--clipboard)
 +                copiar_clipboard=true
 +                shift
 +                ;;
 +            -f|--arquivo)
 +                # Validação de argumento faltante (melhoria de robustez)
 +                if [ -z "$2" ]; then
 +                    _error "Opção $1 requer um valor"
 +                    return 1
 +                fi
 +                arquivo_saida="$2"
 +                shift 2
                 ;;                 ;;
             -h|--help)             -h|--help)
Line 200: Line 266:
         esac         esac
     done     done
 +
 +    # Validação de limites de segurança (melhoria crítica)
 +    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 para os métodos     # Verificar dependências para os métodos
Line 210: Line 287:
         _error "O comando 'openssl' não está instalado."         _error "O comando 'openssl' não está instalado."
         return 1         return 1
 +    fi
 +
 +    # Verificar dependência para clipboard
 +    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     fi
  
Line 221: Line 313:
  
     # Gerar senhas     # Gerar senhas
 +    local ultima_senha=""
     for ((i=1; i<=quantidade; i++)); do     for ((i=1; i<=quantidade; i++)); do
         if [ "$quantidade" -gt 1 ]; then         if [ "$quantidade" -gt 1 ]; then
Line 231: Line 324:
         case "$metodo" in         case "$metodo" in
             random)             random)
-                # Definir conjunto de caracteres base+                # Otimização de performance: limitar leitura de /dev/urandom (melhoria de performance)
                 local caracteres                 local caracteres
-                if [ "$apenas_hex" = true ]; then +                caracteres=$(_gerar_caracteres)
-                    caracteres='0-9A-F' +
-                elif [ "$usar_simbolos" = true ]; then +
-                    caracteres='A-Za-z0-9!@#$%^&*()_+-=[]{}|;:,.<>?' +
-                else +
-                    caracteres='A-Za-z0-9' +
-                fi+
                                  
-                senha=$(head /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento" ; echo)+                if ! senha=$(head -c 1024 /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento"); then 
 +                    _error "Falha ao gerar senha" 
 +                    return 1 
 +                fi
                 ;;                 ;;
             openssl-rand)             openssl-rand)
                 # Gera exatamente o comprimento solicitado                 # Gera exatamente o comprimento solicitado
                 local bytes_necessarios=$((comprimento * 3 / 4 + 1))                 local bytes_necessarios=$((comprimento * 3 / 4 + 1))
-                senha=$(openssl rand -base64 "$bytes_necessarios" | tr -d '\n/+=' | head -c "$comprimento" ; echo)+                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)             mkpasswd|openssl)
                 # Para métodos de hash, primeiro gerar uma senha aleatória                 # Para métodos de hash, primeiro gerar uma senha aleatória
                 local caracteres                 local caracteres
-                if [ "$apenas_hex" = true ]; then +                caracteres=$(_gerar_caracteres)
-                    caracteres='0-9A-F' +
-                elif [ "$usar_simbolos" = true ]; then +
-                    caracteres='A-Za-z0-9!@#$%^&*()_+-=[]{}|;:,.<>?' +
-                else +
-                    caracteres='A-Za-z0-9' +
-                fi+
                                  
-                senha_gerada=$(head /dev/urandom | tr -dc "$caracteres" | head -c "$comprimento" ; echo)+                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                 if [ -z "$senha_gerada" ]; then
Line 268: Line 358:
                 case "$metodo" in                 case "$metodo" in
                     mkpasswd)                     mkpasswd)
-                        senha=$(mkpasswd -m SHA-512 "$senha_gerada" 2>/dev/null) +                        if ! senha=$(mkpasswd -m SHA-512 "$senha_gerada" 2>/dev/null); then
-                        if [ $? -ne 0 ]; then+
                             _error "Falha ao gerar hash com mkpasswd"                             _error "Falha ao gerar hash com mkpasswd"
                             return 1                             return 1
Line 275: Line 364:
                         ;;                         ;;
                     openssl)                     openssl)
-                        senha=$(openssl passwd -6 "$senha_gerada" 2>/dev/null) +                        if ! senha=$(openssl passwd -6 "$senha_gerada" 2>/dev/null); then
-                        if [ $? -ne 0 ]; then+
                             _error "Falha ao gerar hash com openssl"                             _error "Falha ao gerar hash com openssl"
                             return 1                             return 1
Line 297: Line 385:
         # Exibir resultado         # Exibir resultado
         echo -e "${GREEN}${senha}${NC}"         echo -e "${GREEN}${senha}${NC}"
 +        
 +        # Salvar em arquivo se solicitado
 +        if [ -n "$arquivo_saida" ]; then
 +            echo "$senha" >> "$arquivo_saida"
 +        fi
 +
 +        # Guardar última senha para clipboard
 +        ultima_senha="$senha"
                  
         # Espaço entre múltiplas senhas         # Espaço entre múltiplas senhas
Line 303: Line 399:
         fi         fi
     done     done
 +
 +    # Copiar para clipboard se solicitado (melhoria de funcionalidade)
 +    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
  
     # Dicas de segurança     # Dicas de segurança
Line 313: Line 423:
         _info "Use este hash em arquivos de configuração como /etc/shadow"         _info "Use este hash em arquivos de configuração como /etc/shadow"
     fi     fi
 +
 +    # Limpeza de variáveis sensíveis (melhoria crítica de segurança)
 +    # Nota: O trap já cuidará disso, mas fazemos explicitamente também
 +    _limpar_variaveis_sensíveis
 } }
 +
 +# Exportar função se for sourced
 +export -f gerar_senha
 </code> </code>
  
Line 319: Line 436:
  
 1. **Adicionar ao seu ambiente**: 1. **Adicionar ao seu ambiente**:
-   ``` + 
-   # Adicione a função ao ~/.bashrc ou ~/.bash_functions +``` 
-   echo "source ~/.bash_functions" >> ~/.bashrc +# Adicione a função ao ~/.bashrc ou ~/.bash_functions 
-   ```+ echo "source ~/.bash_functions" >> ~/.bashrc 
 +```
  
 2. **Exemplos de uso**: 2. **Exemplos de uso**:
-   ``` + 
-   gerar_senha                           # Senha padrão (20 chars com símbolos) +``` 
-   gerar_senha -c 16 -q 3                # 3 senhas de 16 caracteres +gerar_senha                           # Senha padrão (20 chars com símbolos) 
-   gerar_senha --sem-simbolos -c 32      # Senha de 32 chars sem símbolos +gerar_senha -c 16 -q 3                # 3 senhas de 16 caracteres 
-   gerar_senha --metodo mkpasswd         # Hash SHA-512 para /etc/shadow +gerar_senha --sem-simbolos -c 32      # Senha de 32 chars sem símbolos 
-   ```+gerar_senha --metodo mkpasswd         # Hash SHA-512 para /etc/shadow 
 +```
  
 ===== Considerações Finais ===== ===== Considerações Finais =====
wiki/linux/bash/make_password_bash.1768922437.txt.gz · Last modified: by Wiki Administrator