繁体   English   中英

如何通过登录python来自动化rpmbuild?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM