Ottenere l'immissione della password della riga di comando in Python


234

Sai come in Linux quando provi alcune cose di Sudo che ti dice di inserire la password e, mentre digiti, nulla viene mostrato nella finestra del terminale (la password non viene mostrata)?

C'è un modo per farlo in Python? Sto lavorando a uno script che richiede informazioni così sensibili e vorrei che fosse nascosto quando lo scrivevo.

In altre parole, voglio ottenere la password dall'utente senza mostrare la password.

Risposte:


298

Utilizzare getpass.getpass():

from getpass import getpass
password = getpass()

Un prompt facoltativo può essere passato come parametro; il valore predefinito è "Password: ".

Si noti che questa funzione richiede un terminale appropriato, quindi può disattivare l'eco dei caratteri digitati; vedere "GetPassWarning: impossibile controllare l'eco sul terminale" quando si esegue da IDLE per ulteriori dettagli.


funzionerà, ma come si può stare attenti a un "hacker" che farà una copia dello script e quindi commenterà la riga che richiede la password dell'utente?
asf107

129
@ asf107: se l'hacker può modificare il codice sorgente, ci sono altri problemi di cui preoccuparsi.
DSM

12
@ asf107 - L'idea alla base della richiesta di una password è che puoi passarla per autenticarti con qualcosa (IE, sto usando questo per richiedere una password per autenticarti con un server online). Se un hacker commentasse la linea, il programma semplicemente fallirebbe perché il server non verrebbe più autenticato. L'idea alla base dell'utilizzo getpass()è che nessuno può guardare il codice sorgente e scoprire la tua password semplicemente leggendola, e nessuno può ottenere la tua password semplicemente fissandoti alle spalle e leggendo la password sullo schermo quando la digiti.
ArtOfWarfare il

158
import getpass

pswd = getpass.getpass('Password:')

getpass funziona su Linux, Windows e Mac.


11
"Password:" (con uno spazio dopo i due punti) è il prompt predefinito, quindi spesso non è necessario specificarlo nella chiamata per getpass.getpass ().
JL

getpass è un modulo di libreria standard che esiste da almeno Python 2.5
jocassid

1
questo mi ha dato un errore 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. nell'IDLE, ma ha funzionato bene nel prompt dei comandi,
ho

getpass () non funziona con IDLE. C'è un altro modo per raggiungere questo obiettivo senza getpass ()?
Brendan,

Avere il prompt è sullo stderr (sarà anche necessario import sys): getpass.getpass(<stringa>,sys.stderr)
Philip Kearns,

26

Usa getpass per questo scopo.

getpass.getpass: richiede all'utente una password senza fare eco


che ne dici di riecheggiare * caratteri?
Nikhil VJ

12

Questo codice stamperà un asterisco invece di ogni lettera.

import sys
import msvcrt

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

print '\n'+passwor

7
questo è solo Windows ma almeno non ripete la getpassrisposta. Bene
Jean-François Fabre

3
non gestirà gli spazi posteriori.
Aykut Kllic,

Non sono sicuro che il tuo codice sia per Python 2.x, ma questo non funziona per me. Sto eseguendo Python 3.x. Il primo errore che ho ricevuto è stato un TypeError per la riga 'passwor + = x'. Diceva: "impossibile convertire in modo implicito l'oggetto byte in str". Ho cambiato la linea in modo da lanciare esplicitamente x su stringa come: "password + = str (x)". Ma il codice continua a non funzionare. Quando lo eseguo, non mi richiede input, ma stampa l'asterisco per sempre.
Larper,

@Larper È per Python 2, vedi l'ultima riga del codice
MilkyWay90

0

15.7. getpass - Inserimento password portatile

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

Puoi leggere di più qui


13
Qual è la differenza tra la tua risposta e le altre?
mechnicov,

0

Aggiornamento sulla risposta di @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 solo per Windows, ma getch da PyPI dovrebbe funzionare per entrambi (ho provato solo con Linux). Puoi anche commentare / decommentare le due righe per farlo funzionare per Windows.

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.