scripts script resueltos programas paso pasar parametros hacer español ejercicios ejemplos como comandos bash shell scripting sh

bash - programas - scripts linux ejercicios resueltos



Cómo obtener una contraseña de un script de shell sin hacer eco (7)

Aquí hay otra forma de hacerlo:

#!/bin/bash # Read Password echo -n Password: read -s password echo # Run Command echo $password

La read -s apagará el eco para usted. Simplemente reemplace el echo en la última línea con el comando que desea ejecutar.

Tengo una secuencia de comandos que automatiza un proceso que necesita acceso a un sistema protegido por contraseña. Se accede al sistema a través de un programa de línea de comandos que acepta la contraseña del usuario como un argumento.

Me gustaría pedirle al usuario que escriba su contraseña, la asigne a una variable de shell y luego use esa variable para construir la línea de comandos del programa de acceso (que, por supuesto, producirá un flujo de datos que procesaré).

Soy un programador de shell razonablemente competente en Bourne / Bash, pero no sé cómo aceptar la entrada del usuario sin que tenga eco en el terminal (o tal vez lo haga con caracteres "*").

¿Alguien puede ayudarme con esto?


Desactive el echo usando stty , luego vuelva a stty después.


En primer lugar, si alguien va a almacenar cualquier contraseña en un archivo. Me aseguraría de que sea hash. No es la mejor seguridad, pero al menos no estará en texto plano.

  1. Primero crea la contraseña y hash:

    echo "contraseña123" | md5sum | cortar -d ''-'' -f 1> / tmp / secreto

  2. Ahora cree su programa para usar el hash, en este caso, este pequeño programa recibe la entrada del usuario para una contraseña sin hacer eco y luego lo convierte en hash para compararlo con el hash almacenado. Si coincide con el hash almacenado, se otorga acceso:

    #! / bin / bash

    PASSWORD_FILE="/tmp/secret" MD5_HASH=$(cat /tmp/secret) PASSWORD_WRONG=1 while [ $PASSWORD_WRONG -eq 1 ] do echo "Enter your password:" read -s ENTERED_PASSWORD if [ "$MD5_HASH" != "$(echo $ENTERED_PASSWORD | md5sum | cut -d ''-'' -f 1)" ]; then echo "Access Deniend: Incorrenct password!. Try again" else echo "Access Granted" PASSWORD_WRONG=0 fi done


La opción -s de read no está definida en el estándar POSIX. Consulte http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html . Quería algo que funcionara para cualquier shell POSIX, así que escribí una pequeña función que usa stty para deshabilitar el eco.

#!/bin/sh # Read secret string read_secret() { # Disable echo. stty -echo # Set up trap to ensure echo is enabled before exiting if the script # is terminated while echo is disabled. trap ''stty echo'' EXIT # Read secret. read "$@" # Enable echo. stty echo trap - EXIT # Print a newline because the newline entered by the user after # entering the passcode is not echoed. This ensures that the # next line of output begins at a new line. echo }

Esta función se comporta bastante similar al comando de read . Aquí hay un uso simple de read seguido de un uso similar de read_secret . La entrada a read_secret aparece vacía porque no se hizo eco en el terminal.

[susam@cube ~]$ read a b c foo /bar baz /qux [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=bar c=baz qux [susam@cube ~]$ unset a b c [susam@cube ~]$ read_secret a b c [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=bar c=baz qux [susam@cube ~]$ unset a b c

Aquí hay otro que usa la opción -r para preservar las barras invertidas en la entrada. Esto funciona porque la función read_secret definida anteriormente pasa todos los argumentos que recibe al comando read .

[susam@cube ~]$ read -r a b c foo /bar baz /qux [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=/bar c=baz /qux [susam@cube ~]$ unset a b c [susam@cube ~]$ read_secret -r a b c [susam@cube ~]$ echo a=$a b=$b c=$c a=foo b=/bar c=baz /qux [susam@cube ~]$ unset a b c

Finalmente, aquí hay un ejemplo que muestra cómo usar la función read_secret para leer una contraseña de manera compatible con POSIX.

printf "Password: " read_secret password # Do something with $password here ...


Me pareció útil el comando askpass

password=$(/lib/cryptsetup/askpass "Give a password")

Cada carácter de entrada se sustituye por *. Ver: Dar una contraseña ****


Un trazador de líneas:

read -s -p "Password: " password

Bajo Linux (y cygwin) esta forma funciona en bash y sh. Sin embargo, puede que no sea el estándar de Unix.

Para obtener más información y opciones, en bash, escriba "ayuda leer".

$ help read read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...] Read a line from the standard input and split it into fields. ... -p prompt output the string PROMPT without a trailing newline before attempting to read ... -s do not echo input coming from a terminal


#!/bin/bash stty -echo printf "Password: " read PASSWORD stty echo printf "/n"