"Mascarando" pseudo-senha digitada pelo usuário

Publicado por Sandro Marcell (última atualização em 14/03/2010)

[ Hits: 10.851 ]

Homepage: http://sanmarcell.wordpress.com

Download mascaraSenha




Uma função bem legal que encontrei em www.unix.com escrita em Ksh. Ela mascara uma pseudo-senha digitada pelo usuário utilizando para isso um caractere qualquer, tipo:

Digite sua senha: *****

Achei super interessante e então resolvi "portá-la" para o Bash.

Versão original em Ksh: http://www.unix.com/shell-programming-scripting/49490-reading-password-echo-character.html

  



Esconder código-fonte

#
# Funcao que 'mascara' uma pseudo-senha digitada pelo usuario.
#
# Ex.:
# Digite a senha: *********
#
# Versao original escrita em Ksh'93 por 'Perderabo'
# http://www.unix.com/shell-programming-scripting/49490-reading-password-echo-character.html
#
# Portada para o Bash-3.1.17 por Sandro Marcell <sandro_marcell@yahoo.com.br>
#
# Mais detalhes: 'man bash', 'man stty' e 'man dd'
#
# Obs.: Caso a tecla 'backspace' nao funcione, utilize o comando 'showkey -a'
# para descobrir seu valor e altere conforme o caso.
#
# P.S. Foram feitas pequenas alteracoes em relacao ao codigo original! =)
#
exec 3>&1
function mascaraSenha {
        local mascara backspace enter terminal_info caractere teclas senha
   local -a caracteres
   
   mascara="*"

   # Teclas de controle
   enter=$(printf '\r')
        backspace=$(printf '\b')

   printf "%s" "$1" >&3

   # Salva a configuracao corrente do terminal        
   terminal_info=$(stty --save)
   # Desabilitando impressao de caracteres
        stty -echo -icrnl -icanon min 1 time 0
   
   caractere=0
   while true
   do
      # Teclas pressionadas
      teclas=$(dd bs=1 count=1 status=noxfer 2> /dev/null)
                
      case $teclas in
         $enter)
            break ;;
          $backspace)
            # Volta o cursor uma posicao
            if ((caractere))
            then
               printf "%s" "$backspace $backspace" >&3
               ((caractere--))
            fi
            ;;
              *)
            # Imprimi a 'mascara' na tela 
            printf "%c" "$mascara" >&3
            # Armazena os caracteres especificados
            caracteres[caractere]="$teclas"
            ((caractere++))
      esac
        done

   # Restaura a configuracao do terminal
        stty "$terminal_info" ; echo "" >&3
     
   # Devolve a 'senha' sem caracteres de controle
   for ((i = 0 ; i < caractere ; i++))
   do
                senha+="${caracteres[i]}"
        done
   
   echo "$senha"

   return 0
}

senha=$(mascaraSenha "Senha: ")
exec 3>&- 
echo "A senha digitada foi '$senha'"
# Fim

Scripts recomendados

Validar memória RAM e swap

Copia arquivos distribuidos em pastas diferentes para uma única pasta.

Ispeed v1.1 - Medidor de velocidade de download

slacklibre - Seu Slackware 100% Livre

Script de Instalação de Layer7 no CentOS 6.0


  

Comentários
[1] Comentário enviado por rafael.klock em 08/07/2010 - 13:42h

Gostei, muito legal, vou implementar em outras coisas.

valeu!
falow


Contribuir com comentário