
¿Cómo se pueden leer contraseñas en scripts bash de tal manera que las herramientas no las muestren en una terminal?
(Cambiar la fuente a negro sobre negro se soluciona fácilmente copiando y pegando, por lo que no es una solución).
Respuesta1
De help read
:
-s do not echo input coming from a terminal
Por ejemplo, para solicitar al usuario y leer una contraseña arbitraria en la variable passwd
,
IFS= read -s -p 'Password please: ' passwd
Respuesta2
Siempre solía stty -echo
desactivar el eco, luego leía y luego lo hacía stty echo
(lea 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 de entrada estándar.
En bash, el uso podría verse así:
echo -n "USERNAME: "; IFS= read -r uname
echo -n "PASSWORD: "; stty -echo; IFS= read -r passwd; stty echo; echo
program "$uname" "$passwd"
unset -v 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 conozco bastante bien desde esa perspectiva. Sin embargo, esto no es muy difícil de traducir a otros idiomas.
Respuesta3
Respuesta4
Su pregunta se lee algo diferente "¿en cierto modo como herramientas?" así que no sé exactamente si esto funcionará para ti:
system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******