Getpass.getpass: примеры (PYTHON)
getpass.getpass(prompt: str='Password: ', stream: file-like object=None): strОсновные сведения о функции getpass.getpass
Функция getpass.getpass() из стандартного модуля getpass предназначена для безопасного ввода конфиденциальных данных, таких как пароли, без отображения вводимых символов на экране. Это предотвращает возможность подсматривания вводимой информации посторонними лицами.
Функция обычно используется в консольных приложениях, скриптах для автоматизации и инструментах командной строки, где требуется аутентификация пользователя.
Аргументы функции:
- prompt (строка, необязательный): Сообщение, которое отображается пользователю перед вводом. По умолчанию имеет значение 'Password: '.
- stream (объект файла, необязательный): Поток, в который выводится приглашение. Обычно это sys.stderr. Можно установить в None, чтобы подавить вывод приглашения.
Возвращаемое значение: Функция возвращает введенную пользователем строку без завершающего символа новой строки. Символы не отображаются на экране во время ввода.
При вызове функция пытается отключить эхо ввода на терминале. Если это невозможно (например, при запуске не в терминале), она выводит предупреждение и читает данные обычным способом (с отображением).
Простые примеры использования
Пример с приглашением по умолчанию:
import getpass
try:
password = getpass.getpass()
except Exception as err:
print('Ошибка:', err)
else:
print('Пароль получен. Длина:', len(password))Password: Пароль получен. Длина: 8
Пример с пользовательским приглашением:
import getpass
pin = getpass.getpass(prompt='Введите ваш PIN-код: ')
print(f'Введено символов PIN: {len(pin)}')Введите ваш PIN-код: Введено символов PIN: 4
Пример с отключенным приглашением:
import getpass
import sys
secret = getpass.getpass(prompt='', stream=None) # Приглашение не выводится
print('Секретная фраза сохранена.')Секретная фраза сохранена.
Похожие функции в Python
input(): Стандартная встроенная функция для ввода данных с клавиатуры. Все символы отображаются на экране. Используется для ввода обычных, неконфиденциальных данных.
name = input('Введите ваше имя: ')Введите ваше имя: Алексей
msvcrt.getwch() (только Windows): Функция из модуля msvcrt для чтения одного символа без эха. Требует самостоятельной реализации логики для чтения строки и обработки клавиш.
tty и termios (Unix-подобные системы): Низкоуровневые модули для управления режимами терминала, позволяющие отключить эхо. Использование сложнее, но дает полный контроль.
Рекомендации: Функцию getpass.getpass() предпочтительно использовать для ввода паролей в консольных приложениях. Для ввода обычного текста применяется input(). Низкоуровневые функции (msvcrt, termios) используются в специфичных случаях, когда требуется нестандартное поведение.
Аналоги в других языках программирования
PHP: Функция readline() с отключенным эхо через readline_callback_handler_install() или использование расширения ncurses. Нет прямой стандартной функции.
// Пример с `shell_exec` и stty (для Linux)
echo 'Введите пароль: ';
system('stty -echo');
$password = trim(fgets(STDIN));
system('stty echo');
echo PHP_EOL;JavaScript (Node.js): Модуль readline с отключенным эхо или модуль getpass из npm.
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.stdoutMuted = true;
rl.query = 'Пароль: ';
rl.question(rl.query, function(password) {
console.log('\nВведено символов:', password.length);
rl.close();
});
rl._writeToOutput = function _writeToOutput(stringToWrite) {
if (rl.stdoutMuted) rl.output.write('*');
else rl.output.write(stringToWrite);
};Java: Класс Console и его метод readPassword().
import java.io.Console;
Console console = System.console();
if (console != null) {
char[] password = console.readPassword("Введите пароль: ");
System.out.println("Длина пароля: " + password.length);
java.util.Arrays.fill(password, ' ');
}C#: Метод ReadLine() объекта Console с предварительным установлением Console.ForegroundColor в цвет фона или использование SecureString.
using System;
Console.Write("Пароль: ");
string password = null;
while (true) {
var key = Console.ReadKey(true);
if (key.Key == ConsoleKey.Enter) break;
password += key.KeyChar;
Console.Write("*");
}
Console.WriteLine("\nВвод завершен.");Golang: Пакет golang.org/x/term или syscall для Unix-подобных систем.
package main
import (
"fmt"
"golang.org/x/term"
"syscall"
)
func main() {
fmt.Print("Пароль: ")
bytePassword, err := term.ReadPassword(int(syscall.Stdin))
if err != nil { panic(err) }
password := string(bytePassword)
fmt.Println("\nДлина пароля:", len(password))
}Основное отличие Python-функции заключается в ее кроссплатформенности и простоте использования по сравнению со многими аналогами, которые требуют платформенно-зависимого кода или дополнительных библиотек.
Типичные ошибки и предупреждения
Предупреждение при отсутствии контроля над терминалом: Если ввод не происходит в терминале (например, при перенаправлении ввода из файла), функция выдает предупреждение и читает данные в открытом виде.
import getpass
import io
import sys
# Эмуляция отсутствия терминала
sys.stdin = io.StringIO('мойпароль')
password = getpass.getpass('Пароль: ')
print('Введено:', password)getpass: Ввод может быть отражен. Пароль: Введено: мойпароль
Исключение EOFError: Возникает при прерывании ввода (например, нажатии Ctrl+D в Unix или Ctrl+Z в Windows).
import getpass
try:
pwd = getpass.getpass('Введите пароль (нажмите Ctrl+D для отмены): ')
except EOFError:
print('\nВвод отменен пользователем.')Введите пароль (нажмите Ctrl+D для отмены): Ввод отменен пользователем.
Исключение KeyboardInterrupt: Возникает при нажатии Ctrl+C. Обрабатывается так же, как и для input().
Ошибки кодирования: В редких случаях могут возникать проблемы с кодировкой символов в приглашении или вводимых данных, особенно на Windows с нестандартными локалями.
Изменения в последних версиях
Функция getpass.getpass() остается стабильной и почти не менялась в течение многих версий Python.
В Python 3.10 было улучшено подавление предупреждения при установке параметра stream в None. Теперь предупреждение не выводится, если поток явно отключен.
В Python 3.5 было изменено поведение по умолчанию: параметр stream получил значение по умолчанию sys.stderr вместо sys.stdout.
Для большинства пользователей эти изменения не оказывают существенного влияния на работу функции.
Расширенные примеры использования
Интеграция с библиотекой requests для аутентификации:
import getpass
import requests
username = input('Имя пользователя: ')
password = getpass.getpass('Пароль для {}: '.format(username))
response = requests.get('https://api.example.com/data',
auth=(username, password))
print('Статус ответа:', response.status_code)Имя пользователя: alex Пароль для alex: Статус ответа: 200
Создание мастер-пароля для шифрования данных:
import getpass
import hashlib
while True:
p1 = getpass.getpass('Задайте мастер-пароль: ')
p2 = getpass.getpass('Повторите мастер-пароль: ')
if p1 == p2:
if len(p1) >= 8:
key = hashlib.sha256(p1.encode()).hexdigest()
print('Ключ успешно сгенерирован.')
break
else:
print('Пароль должен содержать минимум 8 символов.')
else:
print('Пароли не совпадают. Попробуйте снова.')Задайте мастер-пароль: Повторите мастер-пароль: Пароли не совпадают. Попробуйте снова. Задайте мастер-пароль: Повторите мастер-пароль: Ключ успешно сгенерирован.
Использование в собственной обертке с ограничением попыток:
import getpass
def get_password_with_retries(prompt='Пароль: ', max_attempts=3):
attempt = 0
while attempt < max_attempts:
password = getpass.getpass(prompt)
if password: # Проверка на непустой ввод
return password
else:
attempt += 1
print(f'Пустой пароль. Попытка {attempt} из {max_attempts}.')
raise ValueError('Превышено количество попыток ввода.')
try:
pwd = get_password_with_retries('Введите секретный ключ: ')
except ValueError as e:
print('Ошибка:', e)
else:
print('Ключ принят.')Введите секретный ключ: Пустой пароль. Попытка 1 из 3. Введите секретный ключ: Ключ принят.
Чтение пароля для SSH-подключения с использованием paramiko:
import getpass
import paramiko
hostname = input('Хост: ')
username = input('Пользователь: ')
password = getpass.getpass(f'Пароль для {username}@{hostname}: ')
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh_client.connect(hostname, username=username, password=password)
print('Подключение установлено.')
except Exception as e:
print('Ошибка подключения:', e)
finally:
ssh_client.close()Хост: example.com Пользователь: admin Пароль для admin@example.com: Подключение установлено.
Имитация ввода пароля для конфигурационного файла:
import getpass
import configparser
config = configparser.ConfigParser()
db_password = getpass.getpass('Пароль БД (оставьте пустым, если без пароля): ')
config['DATABASE'] = {'password': db_password if db_password else ''}
with open('config.ini', 'w') as configfile:
config.write(configfile)
print('Конфигурация сохранена.')Пароль БД (оставьте пустым, если без пароля): Конфигурация сохранена.