使用expect自动化GPG签名

4

我正在编写一个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 的一些奇怪特性吗?还是我做错了什么?欢迎提出解决方法或建议。
谢谢。
2个回答

6

可能只是超时了。尝试添加以下内容:

set timeout 600

或者如果您想永远等待:

set timeout -1

作为您的expect脚本的第一行。

你是指expect块的第一行,还是在我的bash脚本中expect块之前的部分? - scottysseus
2
我对默认的10秒超时时间印象深刻,它实际上可以让程序走得更远,但这确实是解决方案。 - Etan Reisner
你的 expect 块的第一行。 - Sean Bright
是的,这个方法可行。默认值10确实在man手册中提到了……我根本没有想到去检查它。我猜我没有“预料”那会是问题的原因...... - scottysseus
我看到你的用意了。干得好。这整个问题都是为了让你能够在某个地方放下那个双关语吗? - Sean Bright
哈哈,不是的,这个双关语不是我写这个问题的原因。我真的不明白为什么“expect”会停止。那个双关语的机会出现了,我就利用了它。 - scottysseus

1

不要使用expect,你可以使用gpg-agent,这样可以允许你在不需要每次输入密码的情况下进行GPG签名。你可以设置一个长时间的过期时间,这样你可以签署大量的内容,只需定期重新输入密码。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接