Leer contraseña de stdin


180

Escenario: un programa interactivo de CLI Python, que necesita una contraseña. Eso significa también que no hay una solución GUI posible.

En bash, podría obtener una contraseña leída sin volver a solicitarla en la pantalla a través de

read -s

¿Hay algo similar para Python? Es decir,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternativa: Reemplace los caracteres escritos con '*' antes de enviarlos nuevamente a la pantalla (también conocido como estilo de navegador).

Respuestas:


280
>>> import getpass
>>> pw = getpass.getpass()

3
Sí, esas baterías. ;-) Una de las cosas interesantes de Python es su capacidad para enlazarse fácilmente con los archivos binarios en otro lenguaje, en particular C, por lo tanto, aprovechar muchas cosas existentes (como getpass (), creo)
mjv

2
Aún mejor, getpass () se ocupa de la situación en la que una herramienta CLI está alimentando datos a través de STDIN y, sin embargo, desea la capacidad de escribir la contraseña usted mismo. Gran herramienta!
Tiemen

2
@Tiemen, pero vine aquí buscando una solución para hacer esto porque getpass () todavía me está pidiendo y esperando una contraseña a pesar de que puse la contraseña en mi script
Michael

1
Para mí, getpass apareció una ventana (no lo que quería, ni lo que decía su ayuda) y no oculté la contraseña cuando la escribí. Código para reproducir: importar getpass; getpass.getpass ()
Michael Grazebrook

1
pero esto no muestra '*' como un tipo. ¿Cómo se logra esto?
Jason

53

getpass: "Solicitar al usuario una contraseña sin hacer eco".

Editar: Todavía no había jugado con este módulo, así que esto es lo que acabo de preparar (no me sorprendería si encuentras un código similar en todo el lugar):

import getpass

def login():
    user = input("Username [%s]: " % getpass.getuser())
    if not user:
        user = getpass.getuser()

    pprompt = lambda: (getpass.getpass(), getpass.getpass('Retype password: '))

    p1, p2 = pprompt()
    while p1 != p2:
        print('Passwords do not match. Try again')
        p1, p2 = pprompt()

    return user, p1

(Esto es Python 3.x; usar en raw_inputlugar de inputcuando se usa Python 2.x.)

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.