Сообщить об ошибке.

Функция getpass() модуля getpass в Python

Безопасный ввод пароля без повторения

Синтаксис:

import getpass

getpass.getpass(prompt='Password: ', stream=None)

Параметры:

Возвращаемое значение:

  • str, строку с паролем.

Описание:

Функция getpass() модуля getpass печатает подсказку и запрашивает у пользователя пароль без повторения. Входные данные возвращаются в качестве строки для вызывающей стороны.

Пользователю предлагается использовать строковое приглашение prompt, которое по умолчанию имеет значение 'Password: '.

В Unix приглашение записывается в файло-подобный объект stream, используя при необходимости обработчик ошибок замены. Аргумент stream по умолчанию использует управляющий терминал /dev/tty или если он недоступен для sys.stderr.

в Windows аргумент stream игнорируется .

Если ввод пароля без повтора в системе недоступен, то функция getpass.getpass() печатает предупреждающее сообщение в поток sys.stdin и выдает исключение GetPassWarning.

Примеры использования getpass.getpass():

>>> import getpass
>>> p = getpass.getpass()
# Password: 
>>> p
# 'enterpassword'

>>> p = getpass.getpass(prompt='Enter password:`)
# Enter password:

По умолчанию getpass.getpass() использует sys.stdout для печати строки приглашения. Для программы, которая может выдавать полезный вывод на sys.stdout, часто лучше отправить приглашение в другой поток, такой как sys.stderr.

Использование sys.stderr для приглашения означает, что стандартный вывод можно перенаправить в канал или файл, не видя запрос пароля. Введенное пользователем значение по-прежнему не отображается на экране.

>>> import getpass
>>> p = getpass.getpass(stream=sys.stderr)
# Password: 
>>> p
# 'enterpassword'

Использование getpass без терминала:

В Unix для getpass() всегда требуется tty, которым он может управлять через termios, поэтому эхо-вход может быть отключен. Это означает, что значения не будут считываться из нетерминального потока, перенаправленного на стандартный ввод.

Вызывающая сторона должена определить, когда входной поток не является tty и в этом случае использовать альтернативный метод для чтения.

# getpass_noterminal.py
import getpass, sys 

if sys.stdin.isatty():
    p = getpass.getpass('Using getpass: ')
else:
    print('Using readline')
    p = sys.stdin.readline().rstrip()

print('Read: ', p)
# читаем с терминала
$ python3 getpass_noterminal.py

Using getpass:
Read:  sekret

# читаем из потока (без терминала)
$ echo "sekret" | python3 getpass_noterminal.py

Using readline
Read:  sekret