Obtendo entrada de senha da linha de comando no Python

234

Você sabe como, no Linux, quando você tenta algumas coisas do Sudo, ele pede para você digitar a senha e, enquanto digita, nada é mostrado na janela do terminal (a senha não é mostrada)?

Existe uma maneira de fazer isso em Python? Estou trabalhando em um script que requer informações tão confidenciais e gostaria que elas fossem ocultadas quando eu as digitasse.

Em outras palavras, desejo obter a senha do usuário sem mostrá-la.

Nacht
fonte

Respostas:

298

Use getpass.getpass():

from getpass import getpass
password = getpass()

Um prompt opcional pode ser passado como parâmetro; o padrão é "Password: ".

Observe que esta função requer um terminal adequado, para que ele possa desativar o eco dos caracteres digitados - consulte “GetPassWarning: não é possível controlar o eco no terminal” ao executar a partir do IDLE para obter mais detalhes.

Sven Marnach
fonte
funcionará, mas como se pode ter cuidado com um "hacker" que fará uma cópia do script e depois comentar a linha que requer senha de usuário?
101010 asf107
129
@ asf107: Se o hacker puder editar o código fonte, há outros problemas com os quais se preocupar.
DSM
12
@ asf107 - A idéia por trás da solicitação de uma senha é para que você possa transmiti-la para se autenticar com alguma coisa (ou seja, eu estou usando isso para solicitar uma senha para autenticar em um servidor online). Se um hacker comentasse a linha, o programa simplesmente falharia porque o servidor não seria mais autenticado. A idéia por trás do uso getpass()é para que ninguém possa olhar o código-fonte e descobrir sua senha apenas lendo-o, e ninguém possa obtê-la apenas olhando por cima do seu ombro e lendo sua senha na tela quando você digita.
ArtOfWarfare
158
import getpass

pswd = getpass.getpass('Password:')

O getpass funciona em Linux, Windows e Mac.

Nafscript
fonte
11
"Senha:" (com um espaço após os dois pontos) é o prompt padrão; portanto, não é necessário especificá-lo na chamada para getpass.getpass ().
JL
getpass é um módulo de biblioteca padrão que tem sido em torno desde pelo menos Python 2.5
jocassid
1
isto deu-me um erro 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. no IDLE, mas funcionou bem no prompt de comando, encontrou a razão aqui
Oshada
getpass () Não funciona com IDLE. Existe outra maneira de conseguir isso sem getpass ()?
Brendan
Para que o prompt esteja no stderr (você também precisará import sys): getpass.getpass(<string> #,sys.stderr)
Philip Kearns #:
26

Use getpass para esse fim.

getpass.getpass - Solicita ao usuário uma senha sem ecoar

RanRag
fonte
que tal com eco * chars?
Nikhil VJ
12

Este código imprimirá um asterisco em vez de todas as letras.

import sys
import msvcrt

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

print '\n'+passwor
Ahmed ALaa
fonte
7
isso é apenas para Windows, mas pelo menos não está repetindo a getpassresposta. Bom
Jean-François Fabre
3
não vai lidar com backspaces.
Aykut Kllic
Não tenho certeza se o seu código é para Python 2.x, mas isso não funciona para mim. Estou executando o Python 3.x. O primeiro erro que recebi foi um TypeError para a linha 'passwor + = x'. Ele dizia: "não é possível converter o objeto de bytes em str implicitamente". Alterei a linha para converter explicitamente x em string, como: "senha + = str (x)". Mas o código ainda não funciona. Quando o executo, ele não me solicita entrada, apenas imprime o asterisco para sempre.
Mai
@Larper É por Python 2, ver a última linha do código
MilkyWay90
0

15.7 getpass - Entrada de senha portátil

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

Você pode ler mais aqui

Dwi Wardana
fonte
13
Qual é a diferença entre sua resposta e outras?
mechnicov
0

Atualizando com a resposta 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 nos apenas para windows, mas o getch do PyPI deve funcionar para ambos (só testei com linux). Você também pode comentar / descomentar as duas linhas para fazê-lo funcionar no Windows.

Mostafa Hassan
fonte