bash - scripts - shell script linux español




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

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.


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 "[email protected]"

    # 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.

[[email protected] ~]$ read a b c
foo \bar baz \qux
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[[email protected] ~]$ unset a b c
[[email protected] ~]$ read_secret a b c

[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[[email protected] ~]$ 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 .

[[email protected] ~]$ read -r a b c
foo \bar baz \qux
[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[[email protected] ~]$ unset a b c
[[email protected] ~]$ read_secret -r a b c

[[email protected] ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[[email protected] ~]$ 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 ****


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




sh