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
-smuestra nada mientras se escribe la entrada. (-ses una extensión que no es POSIX, por lo que no todos los shells la admiten, como elashshell que viene con BusyBox; use elssty -echoenfoque en tales shells)manpágina sugiere que-sestablezca 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 -ssolució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.readun-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
readque puede usarsttypara deshabilitar el ecofuente
Aquí hay una variación de la excelente
*solución de impresión de @ SiegeXbashcon soporte para retroceso agregado; esto permite al usuario corregir su entrada con labackspaceclave (deleteclave 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 \bes necesario para dar la apariencia de borrar el carácter de la izquierda; con solo usar\bmueve 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,
shen Debian y Ubuntu, dondeshestádash), use elstty -echoenfoque (que es subóptimo, porque no imprime nada ), porque elreadbuiltin no admitirá las opciones-sy-n.fuente
Un poco diferente de (pero sobre todo como) la respuesta de @ lesmana
simplemente: ocultar el eco haz tus cosas mostrar eco
fuente
sttyllamada 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 otrassttyconfiguraciones? 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 sureadincorporado tendría las opciones-sy-n. Por lo tanto, su código no funcionará endash, por ejemplo. (Se trabajará en las plataformas dondeshen realidad esbash, como en OSX, dondebashcuando se invoca comoshmeramente modifica algunas opciones por defecto, mientras que la mayoría sigue apoyando bash.)[pero obviamente no puedo hacer mucho si no tienesreadestas opciones.Siempre me gusta usar caracteres de escape Ansi:
8mhace que el texto sea invisible y0mrestablece 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
readque no haga eco de los caracteres ...fuente
fuente