4

我有调用getpass的 python 脚本(第 3 方脚本) 。
我需要使用脚本来提供密码。简单的管道不起作用,因为根据文档,getpass是从/dev/tty读取的。
我绝不是 shell 或 python 专家,所以有没有办法(不修改使用 getpass 的 .py 脚本)通过 bash\shell 脚本提供密码?

4

2 回答 2

4

这基本上为了从键盘获取输入而设计的。如果您不希望这样,并且您不能更改脚本以从正确许可的配置文件中读取它,那么我将完全修改 getpass 调用。

from mock import patch

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

详细说明“调用你的脚本”,如果这个脚本有一个正确的入口点,例如从 setuptools 生成,那么在源代码中查找被调用的底层函数。您可以导入模块并直接调用相同的函数来“运行”脚本。但是,如果脚本只是一堆模块级代码,那么您将不得不使用exec并显式传递一个范围,包括monkeypatch。

于 2018-02-26T19:33:31.870 回答
0

如果你不能依赖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
    ...
于 2019-12-04T12:37:54.827 回答