bash: 使用 expect 自动化 GPG 签名

bash: using expect to automate GPG signing

我正在编写一个 bash 脚本,用于在 YUM 存储库中自动签署 RPM 包。为了完成这个任务,我使用 expect.

到目前为止,这是我的源代码:

/usr/bin/expect <<EOD
spawn bash -c "rpm --resign ${NEW_REPO}/packages/*.rpm"
expect "Enter pass phrase:"
send "${GPG_PASS}\r"
expect eof
EOD

NEW_REPO 是 YUM 仓库的路径,GPG_PASS 是 GPG 密钥的密码。

在大多数情况下,这工作得很好并且成功地签署了包。

问题: 此代码块仅对 28-30 RPM 包进行签名,即使该目录包含 42 个包。从命令行手动签署一批 RPM 包非常有效,但我脚本中的 expect 块在它到达所有包之前就停止了。这是 expect 的一些奇怪怪癖,还是我做错了什么? Workarounds/suggestions 欢迎。

谢谢

可能只是超时了。尝试添加:

set timeout 600

或者如果你想永远等待:

set timeout -1

作为您期望脚本的第一行。

您可以使用 gpg-agent 而不是使用 expect,这将使您无需每次都输入密码即可对内容进行 GPG 签名。您可以设置一个较长的到期时间,这样您就可以签署很多东西并且只定期重新输入您的密码。

这比在这样的脚本中以纯文本形式存储 GPG 密钥密码要安全得多。