Leggi la password da stdin


180

Scenario: un programma CLI Python interattivo, che necessita di una password. Ciò significa anche che non è possibile alcuna soluzione GUI.

In bash ho potuto ottenere una password di lettura senza ri-richiederlo sullo schermo tramite

read -s

C'è qualcosa di simile per Python? Vale a dire,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternativa: sostituisci i caratteri digitati con '*' prima di rimandarli allo schermo (alias stile browser).

Risposte:


280
>>> import getpass
>>> pw = getpass.getpass()

3
Sì, quelle batterie. ;-) Una delle cose interessanti di Python è la sua capacità di legarsi facilmente con i binari in altre lingue, in particolare C, sfruttando quindi molte cose esistenti (come getpass (), credo)
mjv

2
Ancora meglio, getpass () si occupa della situazione in cui uno strumento CLI viene immesso dati tramite STDIN e tuttavia si desidera la possibilità di digitare la password da soli. Ottimo strumento!
Tiemen,

2
@Tiemen ma sono venuto qui alla ricerca di una soluzione per farlo perché getpass () mi sta ancora chiedendo e sta aspettando una password anche se ho reindirizzato la password al mio script
Michael

1
Per me, getpass ha aperto una finestra (non quello che volevo, né quello che il suo aiuto ha detto) e non ha oscurato la password quando l'ho digitata! Codice da riprodurre: import getpass; getpass.getpass ()
Michael Grazebrook,

1
ma questo non visualizza '*' come un tipo. Come si ottiene questo?
Jason,

53

getpass,: "Richiedi all'utente una password senza fare eco."

Modifica: non avevo ancora giocato con questo modulo, quindi questo è quello che ho appena inventato (non sarei sorpreso se trovassi un codice simile dappertutto):

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

(Questo è Python 3.x; usa raw_inputinvece di inputquando usi Python 2.x.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.