getpass —Solicitud segura de contraseña¶
Propósito: | Solicita al usuario un valor, generalmente una contraseña, sin repetir lo que escribe en la consola. |
---|
Muchos programas que interactúan con el usuario a través de la terminal
necesitan preguntar al usuario valores de contraseña sin mostrar lo que escribe
el usuario la pantalla. El módulo getpass
proporciona una forma portátil
de manejar tales solicitudes de contraseña de forma segura.
Ejemplo¶
La función getpass()
imprime un mensaje, luego lee la entrada del usuario
hasta que presione retorno. La entrada se devuelve como una cadena al que la
llama.
import getpass
try:
p = getpass.getpass()
except Exception as err:
print('ERROR:', err)
else:
print('You entered:', p)
La solicitud predeterminada, si la persona que llama no especifica ninguna, es
«Password:
».
$ python3 getpass_defaults.py
Password:
You entered: sekret
La solicitud se puede cambiar a cualquier valor necesario.
import getpass
p = getpass.getpass(prompt='What is your favorite color? ')
if p.lower() == 'blue':
print('Right. Off you go.')
else:
print('Auuuuugh!')
Algunos programas solicitan una frase de contraseña en lugar de una contraseña simple, para dar mejor seguridad.
$ python3 getpass_prompt.py
What is your favorite color?
Right. Off you go.
$ python3 getpass_prompt.py
What is your favorite color?
Auuuuugh!
Por defecto, getpass()
usa sys.stdout
para imprimir la cadena de
solicitud. Para un programa que puede producir resultados útiles en
sys.stdout
, con frecuencia es mejor enviar la solicitud a otro flujo como
sys.stderr
.
import getpass
import sys
p = getpass.getpass(stream=sys.stderr)
print('You entered:', p)
El uso de sys.stderr
para la solicitud significa que la salida estándar
puede ser redirigida (a una tubería o un archivo) sin ver la solicitud de
contraseña. El valor ingresado por el usuario no se repite en la pantalla.
$ python3 getpass_stream.py >/dev/null
Password:
Usar getpass sin terminal¶
En Unix, getpass()
siempre requiere un tty que puede controlar a través de
termios
, por lo que la reproducción de la entrada se puede deshabilitar.
Esto significa que no se leerán valores desde un flujo no terminal redirigido a
la entrada estándar. En cambio, getpass
intenta llegar al tty de un
proceso, y no se genera ningún error si pueden acceder a él.
$ echo "not sekret" | python3 getpass_defaults.py
Password:
You entered: sekret
Depende de la persona que llama detectar cuándo el flujo de entrada no es un tty, y usar un método alternativo para leer en ese caso.
import getpass
import sys
if sys.stdin.isatty():
p = getpass.getpass('Using getpass: ')
else:
print('Using readline')
p = sys.stdin.readline().rstrip()
print('Read: ', p)
Con un tty:
$ python3 ./getpass_noterminal.py
Using getpass:
Read: sekret
Sin un tty:
$ echo "sekret" | python3 ./getpass_noterminal.py
Using readline
Read: sekret
Ver también
- Documentación de la biblioteca estándar para getpass
readline
– Biblioteca interactiva de solicitudes.