Script Bash: Introducir contraseñas sin mostrarlas en pantalla
Siempre tuve la duda de como podía hacer para que en un script bash uno pueda introducir una clave o contraseña sin que la misma se muestre en pantalla.
Luego de haber encontrado la forma de implementarlo, comencé a utilizar esa funcionalidad en una serie de scripts, pero nunca lo he compartido con todos y es por ello que lo pongo a disposición en este artículo.
A continuación se presentan unos breves pasos que permiten implementar esta funcionalidad mediante dos scripts. El primero abarca la ocultación de la contraseña cuando un usuario proceda a digitarla, y el segundo script despliega caracteres asteriscos (*) por cada letra escrita de la contraseña.
Luego de haber encontrado la forma de implementarlo, comencé a utilizar esa funcionalidad en una serie de scripts, pero nunca lo he compartido con todos y es por ello que lo pongo a disposición en este artículo.
A continuación se presentan unos breves pasos que permiten implementar esta funcionalidad mediante dos scripts. El primero abarca la ocultación de la contraseña cuando un usuario proceda a digitarla, y el segundo script despliega caracteres asteriscos (*) por cada letra escrita de la contraseña.
Primer script
- Antes que nada debemos crear un script de prueba en el lugar que deseamos y asignarle los permisos de ejecución correspondientes:
testsrv:~ # touch input_passwd.sh
testsrv:~ # chmod 755 input_passwd.sh - Luego lo pasamos a editar:
testsrv:~ # vim input_passwd.sh
Y le agregamos el siguiente contenido:#!/bin/bash
Enlace: script en Github Gist.
#
# SCRIPT DE PRUEBA - LEER CONTRASENIAS
# ====================================
#
# -- Se guarda la configuracion de la sesion
# stty actual.
STTY_SAVE=`stty -g`
stty -echo
# -- Se solicita la introduccion del password al
# usuario:
echo
echo -n "Introduzca su password: "
read SECRET_PASSWD
# -- Se restablece la sesion stty anterior.
stty $STTY_SAVE
echo
# -- Despliegue del password:
echo
echo "El password introducido fue: $SECRET_PASSWD"
echo - Finalmente probamos el script ejecutándolo de la siguiente manera:
testsrv:~ # ./input_passwd.sh
Como lo podrán comprobar, al momento de introducir la contraseña no se mostrará ningún solo caracter del mismo.
Introduzca su password:
El password introducido fue: prueba123
testsrv:~ #
Segundo script
También podríamos hacer que despliegue asteriscos (*) o cualquier otra letra o símbolo por cada vez que el usuario digite un caracter de su contraseña.- Para probar este script podríamos crear uno nuevo, o bien como yo volver a utilizar el archivo anterior:
testsrv:~ # vim input_passwd.sh
Cuyo contenido lo reemplazamos por el siguiente:#!/bin/bash
Enlace: script en Github Gist.
#
# SCRIPT DE PRUEBA - LEER CONTRASENIAS
# ====================================
#
# -- Se libera la variable.
unset SECRET_PASSWD
# -- Se solicita la introduccion del password y
# se despliega un asterisco por cada character
# introducido por el usuario.
echo
PROMPT="Introduzca su password: "
while IFS= read -p "$PROMPT" -r -s -n 1 char; do
if [[ $char == $'\0' ]]; then
break
fi
PROMPT='*'
SECRET_PASSWD+="$char"
done
echo
# -- Despliegue del password:
echo
echo "El password introducido fue: $SECRET_PASSWD"
echo - Salimos del archivo anterior y procedemos a probar el script:
testsrv:~ # ./input_passwd.sh
Por cada vez que presionemos una tecla irá mostrando un asterisco para ocultar la contraseña. Esto le permite al usuario tener una referencia visual sobre la longitud de su contraseña.
Introduzca su password: *********
El password introducido fue: prueba123
testsrv:~ #
Ahora bien, el problema que tiene es que cuando se presiona la tecla backspace para borrar los últimos caracteres sigue colocando nuevos asteristos al final, algo que no es del todo correcto.
Hola, estoy intentando ejecutar tu Segundo Script y me aparece el siguiente mensaje d error:
ResponderEliminar'tty: invalid argument '-echo
./pass.sh: line 10: $'\r': command not found
./pass.sh: line 13: $'echo\r': command not found
Introduzca su password:
pass.sh es el nombre con el que lo guardé.
El script funciona si ejecuto comando por comando, pero me aparece el error anteriormente citado cuando lo intento ejecutar desde el fichero pass.sh.
¿alguna idea sobre qué puede estar ocurriendo?
Saludos!
Hola, es extraño, que comandos tenés en las lineas 10 y 13 de tu script? No se si es por ello pero lo comento igual, un script puede dar problemas si es que lo escribiste en Windows y luego lo copias a tu distro Linux..
EliminarSaludos.
Muchas gracias, esto me fue muy útil.
ResponderEliminarExcelente, gracias por comentar Johan, saludos!
Eliminar