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).

Boldewyn
la source

Réponses:

280
>>> import getpass
>>> pw = getpass.getpass()
mjv
la source
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.)

Stephan202
la source