"Mascarando" pseudo-senha digitada pelo usuário

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

[ Hits: 10.530 ]

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

Trocar string A por string B em vários arquivos

mkeggdrop e mkpsybnc

Configurando um Servidor de Nomes no CL10 apenas respondendo algumas perguntas...

POSTFIX AUTOMÁTICO COM MYSQL E IPTABLES - APAGANDO MSG ANTIGAS EM TODAS AS PASTAS DE UM USUÁRIO

Script de Autenticação simples do Speedy HOme


  

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