Obtenir une entrée de mot de passe en ligne de commande dans Python

235

Vous savez comment sous Linux lorsque vous essayez des trucs Sudo, il vous dit d'entrer le mot de passe et, pendant que vous tapez, rien ne s'affiche dans la fenêtre du terminal (le mot de passe n'est pas affiché)?

Existe-t-il un moyen de le faire en Python? Je travaille sur un script qui nécessite des informations si sensibles et souhaite qu'il soit masqué lorsque je le tape.

En d'autres termes, je veux obtenir le mot de passe de l'utilisateur sans afficher le mot de passe.

Nacht
la source

Réponses:

299

Utilisation getpass.getpass():

from getpass import getpass
password = getpass()

Une invite facultative peut être transmise en tant que paramètre; la valeur par défaut est "Password: ".

Notez que cette fonction nécessite un terminal approprié, donc elle peut désactiver l'écho des caractères saisis - voir «GetPassWarning: impossible de contrôler l'écho sur le terminal» lors de l'exécution depuis IDLE pour plus de détails.

Sven Marnach
la source
fonctionnera, mais comment faire attention à un "pirate" qui fera une copie du script et commentera ensuite la ligne qui nécessite un mot de passe utilisateur?
asf107
129
@ asf107: Si le pirate peut modifier le code source, il y a d'autres problèmes à se soucier.
DSM
12
@ asf107 - L'idée derrière la demande d'un mot de passe est que vous puissiez le transmettre pour vous authentifier avec quelque chose (IE, je l'utilise pour demander un mot de passe pour s'authentifier auprès d'un serveur en ligne). Si un pirate commentait la ligne, le programme échouerait simplement parce que le serveur ne serait plus authentifié. L'idée derrière l'utilisation getpass()est que personne ne puisse regarder le code source et trouver votre mot de passe simplement en le lisant, et personne ne peut obtenir votre mot de passe en regardant simplement par-dessus votre épaule et en lisant votre mot de passe à l'écran lorsque vous le saisissez.
ArtOfWarfare
158
import getpass

pswd = getpass.getpass('Password:')

getpass fonctionne sur Linux, Windows et Mac.

Nafscript
la source
11
"Mot de passe:" (avec un espace après les deux-points) est l'invite par défaut, il n'est donc souvent pas nécessaire de le spécifier dans l'appel à getpass.getpass ().
JL
getpass est un module de bibliothèque standard qui existe depuis au moins Python 2.5
jocassid
1
cela m'a donné une erreur Warning (from warnings module): File "C:\Python27\lib\getpass.py", line 92 return fallback_getpass(prompt, stream) GetPassWarning: Can not control echo on the terminal. Warning: Password input may be echoed. dans l'inactivité, mais a bien fonctionné dans l'invite de commande, a trouvé la raison ici
Oshada
getpass () Ne fonctionne pas avec IDLE. Existe-t-il un autre moyen d'y parvenir sans getpass ()?
Brendan
Pour avoir l'invite est sur le stderr (vous aurez également besoin import sys): getpass.getpass(<string>,sys.stderr)
Philip Kearns
26

Utilisez getpass à cet effet.

getpass.getpass - Demande à l'utilisateur un mot de passe sans faire écho

RanRag
la source
que diriez-vous de l'écho des caractères *?
Nikhil VJ
12

Ce code imprimera un astérisque à la place de chaque lettre.

import sys
import msvcrt

passwor = ''
while True:
    x = msvcrt.getch()
    if x == '\r':
        break
    sys.stdout.write('*')
    passwor +=x

print '\n'+passwor
Ahmed ALaa
la source
7
ce n'est que des fenêtres mais au moins ça ne répète pas la getpassréponse. Bon
Jean-François Fabre
3
ne gère pas les espaces arrière.
Aykut Kllic
Je ne sais pas si votre code est pour Python 2.x, mais cela ne fonctionne pas pour moi. J'utilise Python 3.x. La première erreur que j'ai eue était une TypeError pour la ligne 'passwor + = x'. Il disait: "impossible de convertir implicitement l'objet bytes en str". J'ai changé la ligne pour que je transforme explicitement x en chaîne comme: "mot de passe + = str (x)". Mais le code ne fonctionne toujours pas. Lorsque je l'exécute, il ne me demande pas de saisie, il imprime simplement l'astérisque pour toujours.
Le
@Larper C'est pour Python 2, voir la dernière ligne du code
MilkyWay90
0

15.7. getpass - Saisie de mot de passe portable

#!/usr/bin/python3
from getpass import getpass
passwd = getpass("password: ")
print(passwd)

Vous pouvez en lire plus ici

Dwi Wardana
la source
13
Quelle est la différence entre votre réponse et les autres?
mechnicov
0

Mise à jour sur la réponse de @Ahmed ALaa

# import msvcrt
import getch

def getPass():
    passwor = ''
    while True:
        x = getch.getch()
        # x = msvcrt.getch().decode("utf-8")
        if x == '\r' or x == '\n':
            break
        print('*', end='', flush=True)
        passwor +=x
    return passwor

print("\nout=", getPass())

msvcrt nous uniquement pour Windows, mais getch de PyPI devrait fonctionner pour les deux (je n'ai testé qu'avec Linux). Vous pouvez également commenter / décommenter les deux lignes pour le faire fonctionner pour Windows.

Mostafa Hassan
la source