Lectura de contraseñas sin mostrar en pantalla en Bash Scripts

20

¿Cómo leer las contraseñas en los scripts de bash de una manera como las herramientas que no lo muestran en la terminal?

(Cambiar la fuente a negro sobre negro puede ser complicado por la facilidad de copiar y pegar, por lo que no es la solución)

Grzegorz Wierzowiecki
fuente
3
Para cualquiera que lea esto: NO lea contraseñas con eco activado y negro sobre negro. La contraseña aún se transmite, y si el terminal no conoce las directivas del terminal que ha utilizado, los caracteres se harán eco visiblemente. Desactiva el eco. Uso termios, stty, read -s, cualquier cosa que lo hace.
Alexios
Es por eso que escribí, que no es una solución;).
Grzegorz Wierzowiecki
¡En efecto! A veces las personas leen preguntas y llegan a conclusiones equivocadas. :)
Alexios

Respuestas:

30

De help read:

-s        do not echo input coming from a terminal
Ignacio Vazquez-Abrams
fuente
1
Excelente. No está escrito en mi man read, no me he registrado help read. Bueno saber.
Grzegorz Wierzowiecki
3
@GrzegorzWierzowiecki: Estás viendo el manual incorrecto. tienes que leer el manual de bash, es decir, man bashy allí puedes encontrar la opción -sSilent mode. If input is coming from a terminal, characters are not echoed.
pradeepchhetri
5

Siempre solía stty -echodesactivar el eco, luego leer y luego hacer stty echo(leer más viendo man of stty- ie man stty). Esto es más útil desde la perspectiva de los programadores, ya que puede desactivar el eco y luego leer una contraseña de un lenguaje de programación como Java, C (++), Python, etc. con sus "lectores" estándar.

En bash, el uso podría verse así:

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd

Python, por ejemplo, se vería así:

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

Tuve que hacer esto muchas veces en Python, así que lo sé bastante bien desde esa perspectiva. Sin embargo, esto no es muy difícil de traducir a otros idiomas.

Dylan
fuente
-1

Su pregunta se lee de forma diferente "de una manera como las herramientas ???" así que no sé exactamente si esto funcionará para ti:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
2bc
fuente