如何无需输入密码签名RPM包?GPG静默签名问题求助
搞定GPG静默签名自制RPM包的问题
嘿,我来帮你解决这个脚本里GPG签名RPM需要手动输密码的麻烦!先梳理你遇到的几个问题,再一步步给你解决方案:
一、先修正你尝试的命令错误
1. 参数顺序搞混了(第三个命令)
你第三个命令把~/.gnupg/trustdb.gpg插在--clearsign前面,完全打乱了GPG的参数逻辑——选项和命令要放在文件名前面,这个命令直接作废就行,不用纠结。
2. 解决“Inappropriate ioctl for device”报错(第二个命令)
这个错误是因为GPG在非终端环境下还想调用终端交互,加上--no-tty参数就能搞定。另外要注意:--clearsign是用来签名文本文件的,RPM是二进制包,应该用分离式签名(--detach-sign)才对!
修改后的命令:
echo "78910" | gpg --batch --no-tty --passphrase-fd 0 --detach-sign test-1-0.x86_64.rpm
执行后会生成test-1-0.x86_64.rpm.sig的分离签名文件,这才是适合RPM的签名方式。
3. 让--passphrase参数生效(第一个命令)
GPG 2.x之后默认会屏蔽命令行直接传密码的--passphrase参数(怕泄露),推荐用密码文件或者管道的方式,同时加上--no-tty避免弹框:
# 用管道传密码 gpg --batch --no-tty --passphrase-fd 0 --detach-sign test-1-0.x86_64.rpm <<< "78910" # 或者用密码文件(更安全,记得设权限) echo "78910" > ~/.gpg_pass chmod 600 ~/.gpg_pass # 关键!权限太松GPG会拒绝 gpg --batch --no-tty --passphrase-file ~/.gpg_pass --detach-sign test-1-0.x86_64.rpm
二、生成无密码GPG密钥(解决空密码报错)
你的密钥生成脚本里空密码报错,是因为GPG默认不允许无保护的密钥,得加一行%no-protection来放行:
创建生成脚本:
#!/bin/bash cat > gen-key-script <<EOF Key-Type: 1 Key-Length: 2048 # 建议用2048/4096,比1024安全 Subkey-Type: 1 Subkey-Length: 2048 Name-Real: gpg test Name-Email: test@test.com Expire-Date: 0 Passphrase: # 空密码 %no-protection # 关键:允许无密码密钥 EOF # 生成密钥 gpg --batch --gen-key gen-key-script # 配置RPM签名用的宏 echo "%_gpg_name gpg test <test@test.com>" > ~/.rpmmacros
执行这个脚本就能生成无密码的GPG密钥,以后签名就完全不用输密码了!
三、更规范的RPM静默签名流程
其实不用直接调用gpg,用rpm命令结合配置文件来签名更符合RPM的规范:
- 编辑
~/.rpmmacros,添加这些配置(如果用无密码密钥,就去掉密码相关的行):
%_gpg_name gpg test <test@test.com> %_gpg_path ~/.gnupg %__gpg /usr/bin/gpg # 如果用密码文件,加上这行 %__gpg_sign_cmd %{__gpg} --batch --no-tty --passphrase-file ~/.gpg_pass --detach-sign --armor --output %{__signature_filename} %{__plaintext_filename}
- 直接用rpm命令签名:
rpm --resign test-1-0.x86_64.rpm
这样脚本跑起来就完全静默,不用任何交互啦!
最后补个小坑
如果是GPG 2.x版本,还得在~/.gnupg/gpg.conf里加一行:
pinentry-mode loopback
这会让GPG允许从标准输入读取密码,避免莫名其妙弹框。
内容的提问来源于stack exchange,提问作者Alessandro Cardoso
相关产品推荐
相关产品推荐

