Passwort von stdin lesen

180

Szenario: Ein interaktives CLI-Python-Programm, für das ein Kennwort erforderlich ist. Das bedeutet auch, dass keine GUI-Lösung möglich ist.

In Bash konnte ich ein Passwort einlesen lassen, ohne es erneut auf dem Bildschirm über aufzufordern

read -s

Gibt es etwas Ähnliches für Python? Dh

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternative: Ersetzen Sie die eingegebenen Zeichen durch '*', bevor Sie sie an den Bildschirm zurücksenden (auch als Browser-Stil bezeichnet).

Boldewyn
quelle

Antworten:

280
>>> import getpass
>>> pw = getpass.getpass()
mjv
quelle
3
Ja, diese Batterien. ;-) Eine der coolen Sachen bei Python ist seine Fähigkeit, sich leicht mit Binärdateien in einer anderen Sprache, insbesondere C, zu verbinden und so viele vorhandene Dinge (wie getpass (), glaube ich) zu nutzen
mjv
2
Noch besser ist, dass getpass () die Situation behandelt, in der einem CLI-Tool Daten über STDIN zugeführt werden und Sie dennoch die Möglichkeit haben möchten, das Kennwort selbst einzugeben. Tolles Werkzeug!
Tiemen
2
@Tiemen, aber ich bin hierher gekommen, um nach einer Lösung zu suchen, weil getpass () mich immer noch auffordert und auf ein Passwort wartet, obwohl ich das Passwort an mein Skript weitergeleitet habe
Michael
1
Für mich öffnete getpass ein Fenster (nicht das, was ich wollte oder was seine Hilfe sagte) und verdeckte das Passwort nicht, als ich es eingab! Zu reproduzierender Code: getpass importieren; getpass.getpass ()
Michael Grazebrook
1
Dies zeigt jedoch nicht '*' als einen Typ an. Wie erreicht man das?
Jason
53

Ja getpass: "Fordern Sie den Benutzer zur Eingabe eines Kennworts auf, ohne ein Echo zu senden."

Bearbeiten: Ich hatte noch nicht selbst mit diesem Modul gespielt, also habe ich mir das gerade ausgedacht (wäre nicht überrascht, wenn Sie überall ähnlichen Code finden würden):

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

(Dies ist Python 3.x; raw_inputanstelle von inputPython 2.x verwenden.)

Stephan202
quelle