簡體   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