"Mascarando" pseudo-senha digitada pelo usuário
Publicado por Sandro Marcell (última atualização em 14/03/2010)
[ Hits: 10.924 ]
Homepage: http://sanmarcell.wordpress.com
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
#
# 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
Script para acessar terminais LInux e Unixes remotos do XDM
Atualização automática do Slackware
Montando sua máquina virtual para engenharia reversa em Linux
Como rodar o Folding@home no Linux
Criando um painel de controle (Dashboard) para seu servidor com o Homepage
O Abismo entre o Código e o Chão: Saltos Tecnológicos e a Exclusão Estrutural no Brasil
Instalar e Configurar a santíssima trindade (PAP) no Void Linux
NixOS + NVIDIA antiga: como sobreviver ao driver 595 (GTX 750 Ti / Maxwell)
Conhecendo o tmux: Multiplexador de Terminal
Acessando página do Syncthing fora da máquina local
[Resolvido] Meu monitor suporta 100fps. Por que o máximo é 60fps nos jogos?
OpenClaude - toda IA joga mais que neymar (0)
Novos requisitos de sistema para a versão 26.04 (4)









