Przeczytaj hasło ze standardowego wejścia

180

Scenariusz: interaktywny program CLI w języku Python, który potrzebuje hasła. Oznacza to również, że nie ma możliwości rozwiązania GUI.

W bash mogłem odczytać hasło bez ponownego monitowania go na ekranie za pośrednictwem

read -s

Czy jest coś podobnego do Pythona? To znaczy,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternatywnie: Zamień wpisane znaki na „*” przed odesłaniem ich z powrotem do ekranu (styl przeglądarki).

Boldewyn
źródło

Odpowiedzi:

280
>>> import getpass
>>> pw = getpass.getpass()
mjv
źródło
3
Tak, to baterie. ;-) Jedną z fajnych rzeczy w Pythonie jest jego zdolność do łatwego łączenia się z plikami binarnymi w innym języku, w szczególności w C, a zatem wykorzystywanie wielu istniejących rzeczy (takich jak getpass (), jak sądzę)
mjv,
2
Co więcej, getpass () radzi sobie z sytuacją, w której narzędzie CLI jest zasilane danymi przez STDIN, a mimo to chcesz mieć możliwość samodzielnego wpisania hasła. Świetne narzędzie!
Tiemen
2
@Tiemen, ale przyszedłem tutaj, szukając rozwiązania tego problemu, ponieważ getpass () wciąż monituje mnie i czeka na hasło, mimo że przesłałem hasło do mojego skryptu
Michael
1
Dla mnie getpass otworzył okno (nie to, czego chciałem, ani tego, co mówi jego pomoc) i nie zasłaniał hasła, kiedy je wpisałem! Kod do reprodukcji: import getpass; getpass.getpass ()
Michael Grazebrook
1
ale to nie wyświetla „*” jako jednego typu. Jak to osiągnąć?
Jason
53

Tak getpass: „Monituj użytkownika o hasło bez echa”.

Edycja: Sam jeszcze nie grałem z tym modułem, więc właśnie to przygotowałem (nie zdziwiłbym się, gdyby znaleźć wszędzie podobny kod):

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

(To jest Python 3.x; używaj raw_inputzamiast inputpodczas używania Python 2.x.)

Stephan202
źródło