Создание 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
...