Lire le mot de passe depuis stdin


180

Scénario: Un programme Python CLI interactif, qui a besoin d'un mot de passe. Cela signifie également qu'aucune solution GUI n'est possible.

En bash, je pourrais obtenir un mot de passe lu sans le réactiver à l'écran via

read -s

Y a-t-il quelque chose de similaire pour Python? C'est à dire,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternative: Remplacez les caractères tapés par '*' avant de les renvoyer à l'écran (alias le style du navigateur).

Réponses:


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

3
Ouais, ces piles. ;-) Une des choses intéressantes avec Python est sa capacité à se lier facilement avec des binaires dans un autre langage, en particulier C, exploitant ainsi beaucoup de choses existantes (comme getpass (), je crois)
mjv

2
Mieux encore, getpass () traite la situation dans laquelle un outil CLI reçoit des données via STDIN et pourtant vous voulez pouvoir saisir le mot de passe vous-même. Excellent outil!
Tiemen

2
@Tiemen mais je suis venu ici à la recherche d'une solution pour le faire car getpass () m'invite toujours et attend un mot de passe même si j'ai transmis le mot de passe à mon script
Michael

1
Pour moi, getpass a ouvert une fenêtre (pas ce que je voulais, ni ce que son aide disait) et n'a pas obscurci le mot de passe lorsque je l'ai tapé! Code à reproduire: import getpass; getpass.getpass ()
Michael Grazebrook

1
mais cela n'affiche pas «*» comme un type. Comment y parvenir?
Jason

53

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

Edit: Je n'avais pas encore joué avec ce module moi-même, c'est donc ce que je viens de préparer (je ne serais pas surpris si vous trouviez un code similaire partout, cependant):

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; à utiliser à la raw_inputplace de inputlors de l'utilisation de Python 2.x.)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.