Ler senha de stdin

180

Cenário: Um programa CLI Python interativo, que precisa de uma senha. Isso significa também que não há solução GUI possível.

No bash, eu poderia obter uma senha lida sem precisar solicitá-la na tela via

read -s

Existe algo semelhante para Python? Ou seja,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

Alternativa: Substitua os caracteres digitados por '*' antes de enviá-los de volta à tela (também conhecido como estilo do navegador).

Boldewyn
fonte

Respostas:

280
>>> import getpass
>>> pw = getpass.getpass()
mjv
fonte
3
Sim, essas baterias. ;-) Uma das coisa legal com Python é a sua capacidade de se ligar facilmente com binários em outra língua, em particular C, portanto, alavancando um monte de coisas existente (como getpass (), eu acredito)
mjv
2
Melhor ainda, o getpass () lida com a situação em que uma ferramenta CLI está sendo alimentada com dados via STDIN e, no entanto, você deseja digitar a senha por conta própria. Ótima ferramenta!
Tiemen
2
@Tiemen mas eu vim aqui à procura de uma solução para fazer isso porque getpass () ainda está me levando e à espera de uma senha, embora eu canalizada a senha para o meu script
Michael
1
Para mim, o getpass apareceu em uma janela (não o que eu queria, nem o que sua ajuda dizia) e não obscureceu a senha quando a digitei! Código para reproduzir: import getpass; getpass.getpass ()
Michael Grazebrook
1
mas isso não exibe '*' como um tipo. Como alguém consegue isso?
21417 Jason
53

Sim, getpass : "Solicite uma senha ao usuário sem ecoar."

Edit: Eu ainda não tinha brincado com este módulo, então é isso que acabei de preparar (não ficaria surpreso se você encontrar código semelhante em todo o lugar):

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

(Este é o Python 3.x; use em raw_inputvez de inputusar o Python 2.x.)

Stephan202
fonte