2009-11-19 9 views
167

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

En bash que podría conseguir una contraseña sin leer en volver a solicitar que 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: Reemplazar los caracteres escritos con '*' antes de enviarlos de nuevo a la pantalla (también conocido como 'estilo navegador).

Respuesta

259
>>> import getpass 
>>> pw = getpass.getpass() 
+2

Sí, les baterías. ;-) Una de las ventajas de Python es su capacidad de vincularse fácilmente con archivos binarios en otro idioma, en particular C, por lo tanto aprovechando muchas cosas existentes (como getpass(), creo) – mjv

+1

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

+1

@Tiemen pero vine aquí en busca de una solución para hacer esto porque getpass() todavía me está pidiendo y esperando una contraseña a pesar de que conecté la contraseña a mi secuencia de comandos – Michael

50

Sí, getpass: "Solicite al usuario una contraseña sin repetir".

Editar: No había jugado con este módulo a mí mismo, sin embargo, así que esto es lo que acabo de cociné (no se sorprendería si encuentra un código similar en todo el lugar, sin embargo):

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, el uso raw_input en lugar de input al utilizar Python 2.x)

Cuestiones relacionadas