Obtener entrada de contraseña de línea de comandos en Python

234

¿Sabes cómo en Linux cuando intentas algunas cosas de Sudo te dice que ingreses la contraseña y, mientras escribes, no se muestra nada en la ventana del terminal (la contraseña no se muestra)?

¿Hay alguna manera de hacer eso en Python? Estoy trabajando en un script que requiere información tan confidencial y me gustaría que se oculte cuando lo estoy escribiendo.

En otras palabras, quiero obtener la contraseña del usuario sin mostrar la contraseña.

Nacht
fuente

Respuestas:

298

Uso getpass.getpass():

from getpass import getpass
password = getpass()

Se puede pasar una solicitud opcional como parámetro; el valor predeterminado es "Password: ".

Tenga en cuenta que esta función requiere un terminal adecuado, por lo que puede desactivar el eco de los caracteres escritos; consulte “GetPassWarning: No se puede controlar el eco en el terminal” cuando se ejecuta desde IDLE para obtener más detalles.

Sven Marnach
fuente
funcionará, pero ¿cómo se puede tener cuidado con un "hacker" que hará una copia del script y luego comentará la línea que requiere contraseña de usuario?
asf107
129129
@ asf107: Si el hacker puede editar el código fuente, hay otros problemas de los que preocuparse.
DSM
12
@ asf107 - La idea detrás de solicitar una contraseña es para que pueda pasarla para autenticarse con algo (es decir, estoy usando esto para solicitar una contraseña para autenticar con un servidor en línea). Si un hacker comentara la línea, el programa simplemente fallaría porque el servidor ya no se autenticaría. La idea detrás del uso getpass()es para que nadie pueda ver el código fuente y averiguar su contraseña con sólo leerlo, y nadie puede obtener su contraseña por sólo mirando por encima del hombro y la lectura de su contraseña fuera de la pantalla cuando se escribe en.
ArtOfWarfare
158
import getpass

pswd = getpass.getpass('Password:')

getpass funciona en Linux, Windows y Mac.

Nafscript
fuente
11
"Contraseña:" (con un espacio después de los dos puntos) es el mensaje predeterminado, por lo que a menudo no es necesario especificarlo en la llamada a getpass.getpass ().
JL
getpass es un módulo de biblioteca estándar que existe desde al menos Python 2.5
jocassid
1
esto me dio un error 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. en IDLE, pero funcionó bien en el símbolo del sistema, encontré la razón aquí
Oshada
getpass () No funciona con IDLE. ¿Hay otra forma de lograr esto sin getpass ()?
Brendan
Para tener el aviso está en el stderr (también necesitará import sys): getpass.getpass(<cadena>,sys.stderr)
Philip Kearns
26

Use getpass para este propósito.

getpass.getpass: solicita al usuario una contraseña sin hacer eco

RanRag
fuente
¿Qué tal con eco * caracteres?
Nikhil VJ
12

Este código imprimirá un asterisco en lugar de cada letra.

import sys
import msvcrt

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

print '\n'+passwor
Ahmed ALaa
fuente
77
esto es solo para windows pero al menos no repite la getpassrespuesta. Bien
Jean-François Fabre
3
no manejará espacios de respaldo.
Aykut Kllic
No estoy seguro de si su código es para Python 2.x, pero esto no funciona para mí. Estoy ejecutando Python 3.x. El primer error que obtuve fue un TypeError para la línea 'passwor + = x'. Decía: "no se puede convertir el objeto bytes a str implícitamente". Cambié la línea para que explícitamente convierta x en una cadena como: "contraseña + = cadena (x)". Pero el código aún no funciona. Cuando lo ejecuto, no me solicita entradas, solo imprime el asterisco para siempre.
Larper
@Larper Es para Python 2, vea la última línea del código
MilkyWay90
0

15.7 getpass - Entrada de contraseña portátil

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

Puedes leer más aquí

Dwi Wardana
fuente
13
¿Cuál es la diferencia entre tu respuesta y otras?
mechnicov
0

Actualización sobre la respuesta de @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 para Windows, pero getch de PyPI debería funcionar para ambos (solo probé con Linux). También puede comentar / descomentar las dos líneas para que funcione para Windows.

Mostafa Hassan
fuente