Shell script: Mascarando senha digitada

Em minhas andanças pela Internet acabei encontrando um post bem interessante mostrando um exemplo duma função do tipo “hidepassword” (igual àquelas dos campos senha de formulários web!) feita em ksh’93. Como a achei bem legal, resolvi portá-la para o Bash e aqui está o resultado.

#!/bin/bash --norc
#
# Funcao que 'mascara' uma senha digitada pelo usuario
# 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 v3.1.17 por Sandro Marcell
# Email: smarcell@myopera.com
# Blog:  http://www.myopera.com/smarcell/blog
#
# Mais detalhes: 'man bash', 'man stty' e 'man dd'
#
PATH="/bin:/usr/bin:/usr/local/bin"

exec 3>&1
function mascararSenha {
	local mascara backspace enter terminal_info caractere teclas senha
        local -a caracteres

	# Caractere que sera mostrado na tela        
        mascara='*'

	# Teclas de controle
        enter=$(printf 'x0d')
        backspace=$(printf 'x08')

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

        # Salva a configuracao corrente do terminal
        terminal_info=$(stty --save)
        # Desabilitando impressao de caracteres
        stty -echo -icrnl -icanon min 1

        caractere=0
        while true
        do
		# Capturando as teclas pressionadas
        	teclas=$(dd bs=1 count=1 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 o caractere digitado
			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=$(mascararSenha "Senha: ")
exec 3>&- 
echo "A senha digitada foi '$senha'"
# Fim

Caso tenha problemas com as teclas ‘Enter’ e ‘Backspace’ use o comando showkey -a para descobrir seus valores e altere-os conforme o caso.

Falou!!! 😉

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s