2009-11-19 5 views
167

Scénario: programme interactif CLI Python nécessitant un mot de passe. Cela signifie également qu'il n'y a pas de solution GUI possible.Lecture du mot de passe à partir de stdin

En bash je pourrais obtenir un mot de passe lu sans ré-inviter sur écran via

read -s 

Y at-il quelque chose de similaire pour Python? À savoir,

password = raw_input('Password: ', dont_print_statement_back_to_screen) 

Alternative: Remplacer les caractères tapés avec (style aka navigateur ») '*' avant de les renvoyer à l'écran.

Répondre

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

Oui, les batteries. ;-) Une des choses sympa avec Python est sa capacité à se lier facilement avec les binaires dans d'autres langages, en particulier C, tirant ainsi parti de beaucoup de choses existantes (comme getpass(), je crois) – mjv

+1

Encore mieux, getpass() traite de la situation dans laquelle un outil CLI est alimenté par des données via STDIN et pourtant vous voulez la possibilité de taper le mot de passe vous-même. Excellent outil! – Tiemen

+1

@Tiemen mais je suis venu ici à la recherche d'une solution pour faire cela parce que getpass() m'invite encore et attend un mot de passe même si j'ai passé le mot de passe à mon script – Michael

50

Oui, getpass: "Demander à l'utilisateur un mot de passe sans écho."

Edit: Je ne l'avais pas joué avec moi-même module encore, donc ce que je viens de vous cuire (ne serait pas surpris si vous trouvez un code similaire dans tous les sens, bien):

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 

(Ceci est Python 3.x, utilisez raw_input au lieu de input lorsque vous utilisez Python 2.x.)

Questions connexes