파이썬에서 명령 줄 암호 입력하기


234

Linux에서 Sudo를 시도 할 때 비밀번호를 입력하라는 메시지가 표시되고 입력 할 때 터미널 창에 아무것도 표시되지 않습니다 (비밀번호는 표시되지 않음)?

파이썬에서 그렇게하는 방법이 있습니까? 매우 민감한 정보가 필요한 스크립트를 작성 중이며 입력 할 때 숨겨지기를 원합니다.

즉, 비밀번호를 표시하지 않고 사용자로부터 비밀번호를 가져오고 싶습니다.

답변:


298

사용 getpass.getpass():

from getpass import getpass
password = getpass()

선택적 프롬프트는 매개 변수로 전달 될 수 있습니다. 기본값은 "Password: "입니다.

이 기능에는 적절한 터미널이 필요하므로 입력 된 문자의 에코를 끌 수 있습니다 . 자세한 내용 은 IDLE에서 실행할 때“GetPassWarning : 터미널의 에코를 제어 할 수 없음”을 참조하십시오.


작동하지만 스크립트 사본을 만든 다음 사용자 비밀번호가 필요한 행을 주석 처리하는 "해커"를 어떻게주의 할 수 있습니까?
asf107

129
@ asf107 : 해커가 소스 코드를 편집 할 수 있으면 걱정할 다른 문제가 있습니다.
DSM

12
@ asf107-암호를 요청하는 아이디어는 암호를 전달하여 무언가로 인증 할 수 있도록하는 것입니다 (IE, 온라인 서버로 인증하기 위해 암호를 요청하는 데 사용하고 있습니다). 해커가 회선을 주석 처리하면 서버가 더 이상 인증되지 않기 때문에 프로그램이 실패합니다. 사용의 기본 개념 getpass()은 아무도 소스 코드를보고 암호를 읽음으로써 암호를 찾을 수 없도록하고, 입력 할 때 어깨 너머로 쳐다 보면서 화면에서 암호를 읽음으로써 아무도 암호를 얻을 수 없다는 것입니다.
ArtOfWarfare

158
import getpass

pswd = getpass.getpass('Password:')

getpass 는 Linux, Windows 및 Mac에서 작동합니다.


11
"암호 :"(콜론 뒤에 공백이있는)가 기본 프롬프트이므로 getpass.getpass ()를 호출 할 때이를 지정할 필요가없는 경우가 많습니다.
JL

getpass는 최소한 Python 2.5 이후로 사용 된 표준 라이브러리 모듈입니다.
jocassid

1
이로 인해 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. 유휴 상태에서 오류가 발생 했지만 명령 프롬프트에서 제대로 작동하여 이유를 찾았습니다 .
Oshada

getpass () IDLE과 작동하지 않습니다. getpass ()없이 이것을 달성하는 다른 방법이 있습니까?
Brendan

프롬프트를하는 것은 (당신은 또한 필요합니다 표준 에러에 import sys) : getpass.getpass(<문자열>,sys.stderr)
필립 컨스

26

이 목적으로 getpass 를 사용하십시오 .

getpass.getpass-에코하지 않고 사용자에게 비밀번호를 묻습니다.


* 문자를 에코하는 것은 어떻습니까?
Nikhil VJ

12

이 코드는 모든 문자 대신 별표를 인쇄합니다.

import sys
import msvcrt

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

print '\n'+passwor

7
이것은 단지 창이지만 적어도 getpass대답을 반복하지는 않습니다 . 좋음
Jean-François Fabre

3
백 스페이스를 처리하지 않습니다.
Aykut Kllic

코드가 Python 2.x 용인지 확실하지 않지만 이것이 효과가 없습니다. Python 3.x를 실행 중입니다. 첫 번째 오류는 'passwor + = x'줄에 대한 TypeError입니다. "바이트 객체를 str으로 암시 적으로 변환 할 수 없습니다"라고 말했습니다. "password + = str (x)"와 같이 x를 문자열로 명시 적으로 캐스팅하도록 줄을 변경했습니다. 그러나 코드는 여전히 작동하지 않습니다. 실행할 때 입력하라는 메시지가 표시되지 않고 별표가 영원히 인쇄됩니다.
Larper

그것은 파이썬 2입니다 @Larper, 코드의 마지막 줄을 참조
MilkyWay90


0

@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는 Windows의 경우에만 우리에게 있지만 PyPI의 getch 는 두 가지 모두 작동합니다 (Linux로만 테스트했습니다). 두 줄을 주석 처리하거나 주석 처리를 제거하여 창에서 작동하도록 할 수도 있습니다.

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