Abrufen der Befehlszeilen-Passworteingabe in Python

233

Sie wissen, wie Sie unter Linux beim Ausprobieren von Sudo-Inhalten aufgefordert werden, das Kennwort einzugeben, und während der Eingabe wird im Terminalfenster nichts angezeigt (das Kennwort wird nicht angezeigt)?

Gibt es eine Möglichkeit, dies in Python zu tun? Ich arbeite an einem Skript, das so vertrauliche Informationen erfordert, und möchte, dass es beim Tippen ausgeblendet wird.

Mit anderen Worten, ich möchte das Passwort vom Benutzer erhalten, ohne das Passwort anzuzeigen.

Nacht
quelle

Antworten:

297

Verwendung getpass.getpass():

from getpass import getpass
password = getpass()

Eine optionale Eingabeaufforderung kann als Parameter übergeben werden. Der Standardwert ist "Password: ".

Beachten Sie, dass für diese Funktion ein ordnungsgemäßes Terminal erforderlich ist, damit das Echo typisierter Zeichen deaktiviert werden kann. Weitere Informationen finden Sie unter „GetPassWarning: Echo auf dem Terminal kann nicht gesteuert werden“, wenn Sie von IDLE aus ausgeführt werden .

Sven Marnach
quelle
wird funktionieren, aber wie kann man vorsichtig mit einem "Hacker" sein, der eine Kopie des Skripts erstellt und dann die Zeile auskommentiert, für die ein Benutzerkennwort erforderlich ist?
asf107
129
@ asf107: Wenn der Hacker den Quellcode bearbeiten kann, gibt es andere Probleme, über die er sich Sorgen machen muss.
DSM
12
@ asf107 - Die Idee hinter der Anforderung eines Kennworts besteht darin, dass Sie es zur Authentifizierung mit etwas weitergeben können (IE, ich verwende dies, um ein Kennwort zur Authentifizierung bei einem Online-Server anzufordern). Wenn ein Hacker die Zeile auskommentiert, schlägt das Programm einfach fehl, da der Server nicht mehr authentifiziert wird. Die Idee hinter der Verwendung getpass()ist, dass niemand den Quellcode einsehen und Ihr Passwort herausfinden kann, indem er es liest, und niemand kann Ihr Passwort erhalten, indem er einfach über die Schulter starrt und Ihr Passwort vom Bildschirm liest, wenn Sie es eingeben.
ArtOfWarfare
158
import getpass

pswd = getpass.getpass('Password:')

getpass funktioniert unter Linux, Windows und Mac.

Nafscript
quelle
11
"Passwort:" (mit einem Leerzeichen nach dem Doppelpunkt) ist die Standardaufforderung, daher muss es im Aufruf von getpass.getpass () häufig nicht angegeben werden.
JL
getpass ist ein Standardbibliotheksmodul, das es seit mindestens Python 2.5
jocassid
1
Dies gab mir einen Fehler 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. im IDLE, funktionierte aber gut in der Eingabeaufforderung, fand den Grund hier
Oshada
getpass () Funktioniert nicht mit IDLE. Gibt es eine andere Möglichkeit, dies ohne getpass () zu erreichen?
Brendan
Um die Eingabeaufforderung zu haben, ist auf der stderr (Sie werden auch benötigen import sys): getpass.getpass(<string>,sys.stderr)
Philip Kearns
26

Verwenden Sie dazu getpass .

getpass.getpass - Fordert den Benutzer zur Eingabe eines Kennworts auf, ohne es zu wiederholen

RanRag
quelle
Wie wäre es mit Echo * Zeichen?
Nikhil VJ
12

Dieser Code druckt anstelle jedes Buchstabens ein Sternchen.

import sys
import msvcrt

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

print '\n'+passwor
Ahmed ALaa
quelle
7
Dies ist nur Windows, aber zumindest wiederholt es die getpassAntwort nicht. Gut
Jean-François Fabre
3
wird nicht mit Rückräumen umgehen.
Aykut Kllic
Ich bin nicht sicher, ob Ihr Code für Python 2.x ist, aber das funktioniert bei mir nicht. Ich verwende Python 3.x. Der erste Fehler, den ich bekam, war ein TypeError für die Zeile 'passwor + = x'. Es hieß: "Bytes-Objekt kann nicht implizit in str konvertiert werden". Ich habe die Zeile so geändert, dass ich x explizit in eine Zeichenfolge umwandle, z. B.: "Password + = str (x)". Aber der Code funktioniert immer noch nicht. Wenn ich es ausführe, werde ich nicht zur Eingabe aufgefordert, sondern nur das Sternchen für immer gedruckt.
Größer
@Larper Es ist für Python 2, siehe die letzte Zeile des Codes
MilkyWay90
0

15.7. getpass - Tragbare Passworteingabe

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

Sie können mehr lesen hier

Dwi Wardana
quelle
13
Was ist der Unterschied zwischen Ihrer Antwort und anderen?
Mecheticov
0

Aktualisierung der Antwort von @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 uns nur für Windows, aber getch von PyPI sollte für beide funktionieren (ich habe nur mit Linux getestet). Sie können die beiden Zeilen auch kommentieren / auskommentieren, damit sie für Windows funktionieren.

Mostafa Hassan
quelle