Tengo un script 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 argumento.
Me gustaría pedirle al usuario que escriba su contraseña, asígnela a una variable de shell y luego use esa variable para construir la línea de comando del programa de acceso (que por supuesto producirá una salida de flujo que procesaré).
Soy un programador de shell razonablemente competente en Bourne / Bash, pero no sé cómo aceptar la entrada del usuario sin que se repita en el terminal (o tal vez se repita con los caracteres '*').
¿Alguien puede ayudarme con esto?
read
el-r
argumento al leer las contraseñas. De lo contrario, se pueden perder las barras invertidas. Ninguna de las respuestas menciona esto. La respuesta aceptada a la pregunta duplicada cubre este y algunos casos más extremos. Por ejemplo, ajusteIFS=
para no perder espacios finales.Respuestas:
Aquí hay otra forma de hacerlo:
El
read -s
apagará el eco para ti. Simplemente reemplace elecho
en la última línea con el comando que desea ejecutar.fuente
read
comando:read -s -p "Password:" password
read -s
no está en POSIX, su script depende de bash si lo usa. Si desea cumplir con POSIX, en su lugar, debe usar lastty -echo
solución sugerida a continuación, ya questty
susecho
parámetros están definidos en POSIX.echo -n
tampoco está en POSIX. Usar en suprintf
lugar./bin/bash
y no con/bin/sh
, solo para aclarar esto.echo "$REPLY" | sed -r 's/./*/g'
(o incluso un número arbitrario de asteriscos) en lugar de un espacio vacíoecho
para hacerles saber que se ha visto su entrada de contraseña (si escribieron una. Tengo una contraseña predeterminada si eligen omitir la solicitud en mi particular guión)Una respuesta compatible con POSIX. Observe el uso de en
/bin/sh
lugar de/bin/bash
. (Funciona con bash, pero no requiere bash).fuente
stty
si quieres ser compatible con POSIX. El código en esta respuesta se ejecuta perfectamente ni siquiera en bash, sino en todos los shells que se ajustan a POSIX.echo -n "Password: " && read -s password || { stty -echo; read password; stty echo; }
Un trazador de líneas:
Bajo Linux (y cygwin) este formulario funciona en bash y sh. Sin embargo, puede que no sea Unix sh estándar.
Para obtener más información y opciones, en bash, escriba "help read".
fuente
La
-s
opción deread
no está definida en el estándar POSIX. Ver 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 usastty
para deshabilitar echo.Esta función se comporta bastante similar al
read
comando. Aquí hay un uso simple deread
seguido por un uso similar deread_secret
. La entrada aread_secret
aparece vacía porque no se hizo eco en el terminal.Aquí hay otro que usa la
-r
opción para preservar las barras diagonales inversas en la entrada. Esto funciona porque laread_secret
función definida anteriormente pasa todos los argumentos que recibe alread
comando.Finalmente, aquí hay un ejemplo que muestra cómo usar la
read_secret
función para leer una contraseña de manera compatible con POSIX.fuente
oldtty = stty -g
y luego al finalstty $oldtty
para restaurar la configuración anterior. De lo contrario, es genial.El
askpass
comando me pareció útilCada carácter de entrada se reemplaza por *. Ver: dar una contraseña ****
fuente
/lib/cryptsetup/askpass
? Ciertamente no es una herramienta estándar * nix (o GNU / Linux).sudo apt-get install cryptsetup
.Ctrl+C
ella, arruina la terminal/lib/cryptsetup/askpass "Give a password" > pass.txt
Muy útil, ¡gracias!Apague
echo
usandostty
, luego vuelva a encender después.fuente
También puede solicitar una contraseña sin establecer una variable en el shell actual haciendo algo como esto:
Por ejemplo:
Puede agregar varios de estos valores solicitados con salto de línea, haciendo esto:
fuente
Para cualquiera que necesite solicitar una contraseña, puede estar interesado en usar encpass.sh . Este es un script que escribí para propósitos similares de capturar un secreto en tiempo de ejecución y luego encriptarlo para ocasiones posteriores. Las ejecuciones posteriores no solicitan la contraseña, ya que solo usará el valor cifrado del disco.
Almacena las contraseñas cifradas en una carpeta oculta en el directorio de inicio del usuario o en una carpeta personalizada que puede definir a través de la variable de entorno ENCPASS_HOME_DIR. Está diseñado para ser compatible con POSIX y tiene una licencia MIT, por lo que puede usarse incluso en entornos empresariales corporativos. Mi empresa, Plyint LLC , mantiene el script y ocasionalmente publica actualizaciones. Las solicitudes de extracción también son bienvenidas, si encuentra un problema. :)
Para usarlo en sus scripts, simplemente ingrese encpass.sh en su script y llame a la función get_secret. Incluyo una copia del script a continuación para facilitar la visibilidad.
fuente
Este enlace es de ayuda para definir, * Cómo leer la contraseña del uso sin hacer eco en la terminal * Cómo reemplazar cada carácter con el carácter *.
https://www.tutorialkart.com/bash-shell-scripting/bash-read-username-and-password/
fuente
En primer lugar, si alguien va a almacenar cualquier contraseña en un archivo, me aseguraría de que esté en hash. No es la mejor seguridad, pero al menos no estará en texto plano.
Primero, crea la contraseña y la hash:
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 eco, y luego lo convierte en hash para compararlo con el hash almacenado. Si coincide con el hash almacenado, se otorga acceso:
fuente
\n
resultante delecho
comando lejos del hash usando en suecho -n
lugar, ya\n
que no es realmente parte de la contraseña proporcionada, por supuesto, tanto para la creación/tmp/secret
como para la comparación que sigue en su ejemplo.