Автор оригинала: Doug Hellmann.
Цель:
Запрашивать у пользователя значение, обычно пароль, без вывода на консоль того, что он вводит.
Многие программы, которые взаимодействуют с пользователем через терминал, должны запрашивать у пользователя значения пароля, не показывая, что пользователь вводит на экране. Модуль getpass
предоставляет переносимый способ безопасной обработки таких запросов пароля.
Пример
Функция getpass ()
печатает приглашение, а затем считывает ввод от пользователя, пока он не нажмет return. Ввод возвращается вызывающей стороне в виде строки.
getpass_defaults.py
import getpass try: p getpass.getpass() except Exception as err: print('ERROR:', err) else: print('You entered:', p)
Приглашение по умолчанию, если вызывающий абонент не указал его, будет « Пароль:
».
$ python3 getpass_defaults.py Password: You entered: sekret
Запрос можно изменить на любое необходимое значение.
getpass_prompt.py
import getpass p getpass.getpass(prompt'What is your favorite color? ') if p.lower() 'blue': print('Right. Off you go.') else: print('Auuuuugh!')
Некоторые программы запрашивают парольную фразу вместо простого пароля для большей безопасности.
$ python3 getpass_prompt.py What is your favorite color? Right. Off you go. $ python3 getpass_prompt.py What is your favorite color? Auuuuugh!
По умолчанию getpass ()
использует sys.stdout
для печати строки приглашения. Для программы, которая может производить полезный вывод в sys.stdout
, часто лучше отправить приглашение в другой поток, например sys.stderr
.
getpass_stream.py
import getpass import sys p getpass.getpass(streamsys.stderr) print('You entered:', p)
Использование sys.stderr
для приглашения означает, что стандартный вывод может быть перенаправлен (в канал или файл) без отображения запроса пароля. Значение, введенное пользователем, по-прежнему не выводится на экран.
$ python3 getpass_stream.py >/dev/null Password:
Использование getpass без терминала
В Unix для getpass ()
всегда требуется терминал, которым он может управлять с помощью termios
, поэтому эхо ввода можно отключить. Это означает, что значения не будут считываться из нетерминального потока, перенаправленного на стандартный ввод. Вместо этого getpass
пытается получить доступ к tty для процесса, и не возникает никаких ошибок, если они могут получить к нему доступ.
$ echo "not sekret" | python3 getpass_defaults.py Password: You entered: sekret
Вызывающий абонент должен определить, когда входной поток не является терминалом, и использовать альтернативный метод для чтения в этом случае.
getpass_noterminal.py
import getpass import sys if sys.stdin.isatty(): p getpass.getpass('Using getpass: ') else: print('Using readline') p sys.stdin.readline().rstrip() print('Read: ', p)
С tty:
$ python3 ./getpass_noterminal.py Using getpass: Read: sekret
Без tty:
$ echo "sekret" | python3 ./getpass_noterminal.py Using readline Read: sekret
Смотрите также
- стандартная библиотека документации для getpass
- readline – библиотека интерактивных подсказок.