Создание getpass для чтения из сценария оболочки

У меня есть Python-скрипт (сторонний скрипт), вызывающий getpass.
Мне нужно использовать скрипт для предоставления пароля. Простой конвейер не работает, потому что, согласно документу, getpass читает из / dev / tty.
Я ни в коем случае не эксперт по оболочке или Python, так есть ли способ (без изменения.py сценария, который использует getpass), чтобы предоставить пароль через сценарий bash\shell?

1 ответ

Решение

Это в основном предназначено для ввода с клавиатуры. Если вам это не нужно, и вы не можете изменить сценарий для чтения его из файла конфигурации с правильно разрешенными настройками, тогда я бы просто полностью отключил вызов getpass.

from mock import patch

with patch('path.to.import.getpass') as mock:
    mock.return_value = 'hunter2'
    # call your script

Чтобы уточнить "вызов вашего скрипта", если этот скрипт имеет правильную точку входа, например, сгенерированную из setuptools, то посмотрите в источнике, чтобы найти основную функцию, которая вызывается. Вы можете импортировать модуль и вызывать ту же функцию напрямую, чтобы "запустить" скрипт. Однако, если скрипт представляет собой просто набор кода уровня модуля, вам придется использовать exec и явно передать в область действия, включая monkeypatch.

Если ты не можешь положиться на mock по какой-то причине вы можете использовать простой менеджер контекста:

class NeuteredGetpass:
    def __init__(self, new_pwd):
        def noop(*args, **kwargs):
            return new_pwd

        self.oldpass = getpass.getpass
        self.newpass = noop

    def __enter__(self):
        getpass.getpass = self.newpass

    def __exit__(self, exc_type, exc_val, exc_tb):
        getpass.getpass = self.oldpass


use_this_pass = NeuteredGetpass

with use_this_pass('password_from_shell_script'):
    # do your stuff
    ...
Другие вопросы по тегам