"Mascarando" pseudo-senha digitada pelo usuário

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

[ Hits: 10.498 ]

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

Remover kernels antigos com zenity

Backup Automatizado

Backup avançado

backup rsync

Mudar senha de usuário automaticamente


  

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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts