[英]How can I automate rpmbuild with signing in python?
通常,您可以通过管道输入stdin来自动完成交互式提示的答案:
import subprocess as sp
cmd = 'rpmbuild --sign --buildroot {}/BUILDROOT -bb {}'.format(TMPDIR, specfile)
p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE, stdin=sp.PIPE, universal_newline=True, shell=True)
for out in p.communicate(input='my gpg passphrase\n'):
print(out)
无论出于什么原因,这都不适合我。 我尝试过写入p.stdin
,在执行p.communicate()
之前,尝试过刷新缓冲区,尝试过使用不p.communicate()
universal_newlines=True
字节,对内容进行了硬编码等。在所有情况下,该命令已执行并挂起:
Enter pass phrase:
我的第一个直觉是stdin
不是正确的文件描述符,并且rpmbuild
在内部调用了gpg
命令,也许我的输入没有通过管道传递。 但是当我执行p.stdin.close()
我收到有关尝试写入已关闭描述符的subprocess
OSerror
。
rpmbuild命令对stdin
做了什么阻止我对其进行写入?
我能做些骇客吗? 我尝试echo "my passphrase" | rpmbuild ....
echo "my passphrase" | rpmbuild ....
作为命令,但是不起作用。
我知道我可以使用gpg
来执行某些操作,例如命令和签名包而无需输入密码,但是我有点想避免这种情况。
编辑:
经过一番阅读之后,我意识到这是需要输入密码的命令的常见问题,通常使用getpass
形式。
我看到一个解决方案是使用像pexpect
这样的库,但是我想要标准库中的东西。 我将继续寻找,但是我想也许我可以尝试写类似/dev/tty
东西。
rpm使用getpass(3)重新打开/ dev / tty。
有2种自动化方法:1)创建一个伪指令2)(linux)在/ proc中找到重新打开的文件描述符
如果编写脚本,则Expect(1)包含一个(或具有一个)简短示例,其中包含可以使用的伪脚本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.