stdin에서 비밀번호 읽기


180

시나리오 : 암호가 필요한 대화식 CLI Python 프로그램. 그것은 또한 가능한 GUI 솔루션이 없다는 것을 의미합니다.

bash에서는 화면을 통해 다시 프롬프트하지 않고 암호를 읽을 수 있습니다.

read -s

파이썬과 비슷한 것이 있습니까? 즉,

password = raw_input('Password: ', dont_print_statement_back_to_screen)

대안 : 입력 한 문자를 화면으로 다시 보내기 전에 '*'로 바꿉니다 (브라우저 스타일).

답변:


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

3
예, 배터리입니다. ;-) 파이썬의 멋진 점 중 하나는 다른 언어, 특히 C의 바이너리와 쉽게 바인딩 할 수 있다는 점입니다. 따라서 getpass () 같은 기존의 많은 것들을 활용합니다
mjv

2
getpass ()는 STDIN을 통해 CLI 도구에 데이터가 공급되는 상황을 처리하지만 암호를 직접 입력 할 수 있기를 원합니다. 훌륭한 도구!
Tiemen

2
@Tiemen 그러나 getpass ()가 비밀번호를 내 스크립트에 파이프로 보내도 비밀번호를 기다리는 중이므로 getpass ()가이를 수행하기위한 해결책을 찾고있었습니다.
Michael

1
나에게 getpass는 창을 띄우고 (내가 원하는 것이 아니며 도움이 말한 내용이 아님) 암호를 입력 할 때 모호하지 않았습니다! 재현 코드 : import getpass; getpass.getpass ()
Michael Grazebrook

1
그러나 이것은 '*'를 한 유형으로 표시하지 않습니다. 어떻게 이것을 달성합니까?
Jason

53

예, getpass: "에코없이 사용자에게 암호를 묻습니다."

편집 : 아직이 모듈을 가지고 놀지 않았으므로 이것이 방금 요리 한 것입니다 (그러나 모든 곳에서 비슷한 코드를 찾으면 놀라지 않을 것입니다).

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

(이것은 Python 3.x입니다. Python 2.x를 사용할 때 raw_input대신 input사용하십시오.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.