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.

Primer script

  1. 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
    
  2. Luego lo pasamos a editar:
    testsrv:~ # vim input_passwd.sh
    
    Y le agregamos el siguiente contenido:
    #!/bin/bash
    #
    # 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
    
    Enlace: script en Github Gist.

  3. Finalmente probamos el script ejecutándolo de la siguiente manera:
    testsrv:~ # ./input_passwd.sh
    
    Introduzca su password:
    
    El password introducido fue: prueba123
    
    testsrv:~ #
    
    Como lo podrán comprobar, al momento de introducir la contraseña no se mostrará ningún solo caracter del mismo.


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.
  1. 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
    #
    # 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
    
    Enlace: script en Github Gist.

  2. Salimos del archivo anterior y procedemos a probar el script:
    testsrv:~ # ./input_passwd.sh
    
    Introduzca su password: *********
    
    El password introducido fue: prueba123
    
    testsrv:~ #
    
    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.

    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.


Fuentes

Comentarios

  1. Hola, estoy intentando ejecutar tu Segundo Script y me aparece el siguiente mensaje d error:

    '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!

    ResponderEliminar
    Respuestas
    1. 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..

      Saludos.

      Eliminar
  2. Muchas gracias, esto me fue muy útil.

    ResponderEliminar
    Respuestas
    1. Excelente, gracias por comentar Johan, saludos!

      Eliminar

Publicar un comentario

Entradas populares