Получение пароля для командной строки в Python

235

Вы знаете, как в Linux, когда вы пробуете что-то из Sudo, он говорит вам ввести пароль, и при вводе ничего не отображается в окне терминала (пароль не отображается)?

Есть ли способ сделать это в Python? Я работаю над сценарием, который требует такой конфиденциальной информации и хотел бы, чтобы он был скрыт при вводе.

Другими словами, я хочу получить пароль от пользователя, не показывая пароль.

Nacht
источник

Ответы:

299

Используйте getpass.getpass():

from getpass import getpass
password = getpass()

Необязательный запрос может быть передан в качестве параметра; по умолчанию это "Password: ".

Обратите внимание, что для этой функции требуется соответствующий терминал, поэтому она может отключить эхо напечатанных символов - см. «GetPassWarning: не может управлять эхом на терминале» при запуске из IDLE для получения дополнительной информации.

Свен Марнах
источник
будет работать, но как можно быть осторожным с «хакером», который сделает копию скрипта и затем закомментирует строку, требующую пароль пользователя?
asf107
129
@ asf107: Если хакер может редактировать исходный код, есть другие проблемы, о которых нужно беспокоиться.
DSM
12
@ asf107 - Идея, стоящая за запросом пароля, заключается в том, чтобы вы могли передать его для аутентификации с помощью чего-либо (IE, я использую это для запроса пароля для аутентификации на онлайн-сервере). Если хакер закомментировал строку, программа просто потерпит неудачу, потому что сервер больше не будет аутентифицироваться. Идея, лежащая в основе использования, getpass()заключается в том, что никто не может смотреть на исходный код и узнать ваш пароль, просто прочитав его, и никто не может получить ваш пароль, просто глядя через плечо и читая пароль с экрана, когда вы вводите его.
ArtOfWarfare
158
import getpass

pswd = getpass.getpass('Password:')

getpass работает на Linux, Windows и Mac.

Nafscript
источник
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. в IDLE, но хорошо работало в командной строке, нашел причину здесь
Oshada
getpass () не работает с IDLE. Есть ли другой способ добиться этого без getpass ()?
Брендан
Чтобы подсказка была на stderr (вам также понадобится import sys): getpass.getpass(<string>,sys.stderr)
Филипп Кернс
26

Используйте getpass для этой цели.

getpass.getpass - запрашивает у пользователя пароль без повторения

RanRag
источник
как насчет повторения * символов?
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ответ. Хорошо
Жан-Франсуа Фабр
3
не будет обрабатывать возвраты.
Aykut Kllic
Я не уверен, что ваш код для Python 2.x, но это не работает для меня. Я использую Python 3.x. Первая ошибка, которую я получил, была TypeError для строки 'passwor + = x'. Он сказал: «не может конвертировать байты объекта в str неявно». Я изменил строку так, чтобы я явным образом приводил x к строке, такой как: «password + = str (x)». Но код все равно не работает. Когда я запускаю его, он не запрашивает ввода, а просто печатает звездочку навсегда.
Larper
@Larper Это для Python 2, см. Последнюю строку кода
MilkyWay90
0

15.7. getpass - Портативный ввод пароля

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

Вы можете прочитать больше здесь

Дви Вардана
источник
13
В чем разница между вашим ответом и другими?
Мечников
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, но getch из PyPI должен работать для обоих (я тестировал только с linux). Вы также можете прокомментировать / раскомментировать две строки, чтобы они работали для окон.

Мостафа Хасан
источник