如何在Bash脚本中无交互使用gpg --pinentry-mode loopback?
无交互使用--pinentry-mode loopback解密PGP文件
可以无交互使用--pinentry-mode loopback,但需要先配置GPG允许该模式,并配合密码传递方式实现无交互解密。
第一步:开启loopback模式支持
编辑用户级GPG配置文件~/.gnupg/gpg.conf(系统级可编辑/etc/gnupg/gpg.conf),添加或确认以下配置行:
allow-loopback-pinentry
保存后重启gpg-agent生效:
gpgconf --kill gpg-agent
无交互解密的实现方式
方式1:通过标准输入传递密码
在Bash脚本中,结合--passphrase-fd 0将密码通过标准输入传入,同时指定GPG_TTY避免环境错误:
export GPG_TTY=$(tty) gpg --pinentry-mode loopback --passphrase-fd 0 --decrypt your_file.gpg > decrypted_output.txt <<EOF 你的密钥密码 EOF
方式2:通过密码文件传递
创建权限严格的密码文件(权限设为600,防止其他用户读取):
echo "你的密钥密码" > pass.txt chmod 600 pass.txt
然后在脚本中调用:
export GPG_TTY=$(tty) gpg --pinentry-mode loopback --passphrase-file pass.txt --decrypt your_file.gpg > decrypted_output.txt
方式3:利用gpg-agent缓存密码
如果不想明文存储密码,可先将密码缓存到gpg-agent(仅需手动输入一次,后续一段时间内解密无需重复输入):
# 缓存密码 echo "你的密钥密码" | gpg --pinentry-mode loopback --passphrase-fd 0 --quick-sign - # 后续无交互解密 export GPG_TTY=$(tty) gpg --pinentry-mode loopback --decrypt your_file.gpg > decrypted_output.txt
额外排查点
你遇到的gpg: public key decryption failed: Permission denied和gpg: decryption failed: No secret key错误,除了pinentry模式问题,还可以检查:
~/.gnupg/目录权限是否为700,密钥文件权限是否为600- 当前用户是否有权限访问GPG密钥环
- 密钥是否正确导入到当前用户的密钥库中
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

