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?
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.
Primero crea la contraseña y hash:
echo "contraseña123" | md5sum | cortar -d ''-'' -f 1> / tmp / secreto
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"