Python 从shell脚本读取getpass

Python 从shell脚本读取getpass,python,shell,getpass,Python,Shell,Getpass,我正在调用python脚本(第三方脚本)。 我需要使用脚本来提供密码。简单管道不起作用,因为根据文档,getpass从/dev/tty读取。 我绝不是shell或python专家,因此有没有一种方法(不修改使用getpass的.py脚本)通过bash\shell脚本提供密码?这基本上是为了从键盘获取输入。如果您不希望这样做,并且您不能更改脚本以从正确授权的配置文件读取它,那么我只需要完全修补getpass调用 from mock import patch with patch('path.to

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

这基本上是为了从键盘获取输入。如果您不希望这样做,并且您不能更改脚本以从正确授权的配置文件读取它,那么我只需要完全修补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 NeuteEdge程序:
定义初始值(自我、新pwd):
def noop(*args,**kwargs):
返回新的\u pwd
self.oldpass=getpass.getpass
self.newpass=noop
定义输入(自我):
getpass.getpass=self.newpass
定义退出(自身、exc类型、exc val、exc tb):
getpass.getpass=self.oldpass
使用此通行证=NeuteredGetpass
使用此密码(“来自shell脚本的密码”):
#做你的事
...

wim,这与直接使用硬编码/明文传递有何不同?(就
getpass
而言,这是OP唯一要处理的事情)。这是一个很好的答案,但最好包含一些关于如何实际执行调用脚本部分的信息。这可能取决于该脚本的具体情况,但也许阅读源脚本并使用
exec
可能是一个包罗万象的方法。据我所知,OP正在调用一个调用
getpass.getpass()的脚本
而且他们不能修改脚本。@据我所知,heemayl的目标是避免
getpass
请求输入(即阻塞,不适合编写脚本的使用)——而不修改调用
getpass
的源代码。@wim给出的解决方案只是一个很小的例子。如果需要,可以通过硬编码以外的其他方式获得模拟getpass的
return\u值。我认为硬编码/明文不一定是问题的一部分,但也许OP可以澄清。是的
'hunter2'
可以来自另一个脚本或许可文件,如果必要的话。我在这里的目的不是试图击败
getpass
(困难),而是首先修补它(容易)。