Tengo un script bash como el siguiente:
#!/bin/bash
echo "Please enter your username";
read username;
echo "Please enter your password";
read password;
Quiero que cuando el usuario escriba la contraseña en el terminal, no se muestre (o se muestre algo como *******)). ¿Cómo logro esto?
*
mientrasread
? y otros.Respuestas:
Simplemente proporcione -s a su llamada de lectura así:
fuente
-s
muestra nada mientras se escribe la entrada. (-s
es una extensión que no es POSIX, por lo que no todos los shells la admiten, como elash
shell que viene con BusyBox; use elssty -echo
enfoque en tales shells)man
página sugiere que-s
establezca el color del texto al mismo que el color de fondo. Simplemente "resuena silenciosamente". ss64.com/bash/read.htmlSilent mode. If input is coming from a terminal, characters are not echoed.
Actualizar
En caso de que quiera ser elegante al generar un
*
para cada carácter que escriben, puede hacer algo como esto (usando laread -s
solución de andreas ):Sin ser elegante
fuente
IFS=$'\n'
para que pueda terminar de escribir la contraseña. De lo contrario agradable; muy inteligente.IFS=$'\n'
porque el delimitador predeterminado de lectura es-d $'\n'
. La sentencia if para romper en una cadena nul, que ocurre en una nueva línea, es lo que les permite terminar la contraseña.read
un-d ''
. Cuando lo intenté más tarde en Linux, usé la versión reenviada. Si intento omitir,-d ''
por supuesto, ¡funciona de manera idéntica en FreeBSD! De hecho, estoy bastante aliviado de que no haya ninguna magia de plataforma misteriosa en funcionamiento aquí.para una solución que funcione sin bash o ciertas características
read
que puede usarstty
para deshabilitar el ecofuente
Aquí hay una variación de la excelente
*
solución de impresión de @ SiegeXbash
con soporte para retroceso agregado; esto permite al usuario corregir su entrada con labackspace
clave (delete
clave en una Mac) , como suele ser compatible con las indicaciones de contraseña:Nota:
0x7f
: "En los sistemas modernos, la tecla de retroceso a menudo se asigna al carácter de eliminación (0x7f en ASCII o Unicode)" https://en.wikipedia.org/wiki/Backspace\b \b
es necesario para dar la apariencia de borrar el carácter de la izquierda; con solo usar\b
mueve el cursor a la izquierda, pero deja el carácter intacto ( retroceso no destructivo ). Al imprimir un espacio y retroceder nuevamente, el carácter parece haber sido borrado (gracias, El carácter de escape "retroceso" '\ b' en C, ¿comportamiento inesperado? ).En un shell de solo POSIX (por ejemplo,
sh
en Debian y Ubuntu, dondesh
estádash
), use elstty -echo
enfoque (que es subóptimo, porque no imprime nada ), porque elread
builtin no admitirá las opciones-s
y-n
.fuente
Un poco diferente de (pero sobre todo como) la respuesta de @ lesmana
simplemente: ocultar el eco haz tus cosas mostrar eco
fuente
stty
llamada y una variable menos en la pila: solo elimina el eco y solo restaura el eco. ¿Hay alguna forma posible de que esto pueda alterar otrasstty
configuraciones? Lesmana conserva todos los escenarios.Aquí hay una variación de la respuesta de @ SiegeX que funciona con el shell Bourne tradicional (que no tiene soporte para
+=
asignaciones).fuente
[[ ... ]]
, ni suread
incorporado tendría las opciones-s
y-n
. Por lo tanto, su código no funcionará endash
, por ejemplo. (Se trabajará en las plataformas dondesh
en realidad esbash
, como en OSX, dondebash
cuando se invoca comosh
meramente modifica algunas opciones por defecto, mientras que la mayoría sigue apoyando bash.)[
pero obviamente no puedo hacer mucho si no tienesread
estas opciones.Siempre me gusta usar caracteres de escape Ansi:
8m
hace que el texto sea invisible y0m
restablece el texto a "normal". La -e hace posible que Ansi se escape.La única advertencia es que aún puede copiar y pegar el texto que está allí, por lo que probablemente no debería usar esto si realmente desea seguridad.
Simplemente permite que las personas no miren sus contraseñas cuando las escribe. Simplemente no deje su computadora encendida después. :)
NOTA:
Lo anterior es independiente de la plataforma siempre que sea compatible con las secuencias de escape de Ansi.
Sin embargo, para otra solución Unix, simplemente podría decirle
read
que no haga eco de los caracteres ...fuente
fuente