You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动化RPM发行版签名?无图形无root云环境实操咨询

无root/无图形界面下实现RPM自动GPG签名方案

1. 适配GPG Agent的终端环境

服务器无图形界面时,GPG默认会尝试调用图形化pinentry程序,导致签名卡住,先做以下配置:

  • 新建/编辑~/.gnupg/gpg-agent.conf,添加:
    pinentry-program /usr/bin/pinentry-tty
    allow-preset-passphrase
    
  • 重启GPG Agent生效:
    gpg-connect-agent reloadagent /bye
    
  • 脚本中必须指定GPG_TTY,否则Agent无法识别终端:
    export GPG_TTY=$(tty)
    

2. 修正.rpmmacros配置

确保宏配置正确关联GPG密钥并允许预设密码,编辑~/.rpmmacros:

%_gpg_name 你的GPG密钥ID(例:ABC123DEF456)
%__gpg_sign_cmd %{__gpg} gpg --batch --no-verbose --no-armor --use-agent --no-secmem-warning -u "%{_gpg_name}" -sbo %{__signature_filename} %{__plaintext_filename}
%_allow_preset_passphrase 1

这里的核心是开启%_allow_preset_passphrase,并让签名命令使用Agent。

3. 预加载GPG密码到Agent

把你存在.bashrc里的密码环境变量(假设名为GPG_PASSPHRASE)预先导入Agent,避免签名时交互:

  • 先获取密钥的Keygrip:
    gpg --with-keygrip --list-secret-keys 你的GPG密钥ID
    
    从输出里复制Keygrip对应的32位字符串。
  • 用gpg-preset-passphrase加载密码(注意路径可能因系统不同而变化,比如/usr/lib/gpg-preset-passphrase):
    echo "$GPG_PASSPHRASE" | /usr/libexec/gpg-preset-passphrase -c 你的Keygrip值
    

4. 编写自动化签名脚本

确保脚本能正确读取环境变量,因为非登录shell默认不会加载.bashrc,脚本示例:

# 加载.bashrc中的环境变量
source ~/.bashrc

# 配置GPG终端环境
export GPG_TTY=$(tty)

# 执行RPM签名
rpm --addsign path/to/your/package.rpm
# 若用rpmbuild直接构建并签名:rpmbuild -ba --sign your-package.spec

常见排查点

  • 检查_allow_preset_passphrase是否生效:rpm --showrc | grep allow-preset-passphrase,输出应包含_allow_preset_passphrase: 1
  • 确认GPG Agent在运行:pgrep gpg-agent,若未运行则执行gpg-agent --daemon
  • 验证密钥预设是否成功:gpg --quick-sign -u 你的密钥ID test.txt,若无需输入密码则说明预设有效

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:37:16