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

bash脚本内执行GPG解密未弹出passphrase输入提示的问题

具体问题原因
  • 执行顺序逻辑颠倒:你把清空GPG代理缓存的操作放在了解密命令之后,完全起不到作用。当前系统的gpg-agent会默认缓存你之前输入过的GPG密码(默认缓存时长通常为几小时),跑脚本时gpg直接读取缓存的密码完成解密,根本不会触发密码输入弹窗。单独执行gpg命令时你可能刚好刚清空过缓存、或者缓存已过期,所以才会正常弹框。
  • 路径匹配错误:脚本第11行写的是cat p1.txt相对路径,但你解密输出的文件存放在绝对路径~/programs/utils/scripts/gpg/gpgout/p1.txt下,如果脚本运行时的工作目录不是gpgout文件夹,会直接报找不到文件的错误。
  • 通配符兼容问题:如果gpgout目录下没有任何文件,wipe -rfi ~/programs/utils/scripts/gpg/gpgout/*里的*不会匹配到任何内容,部分shell会把未匹配的通配符原样传给wipe,导致命令报错中断脚本。
修复后的可用脚本
#!/bin/bash
###################################
# securely decrypt password file and delete
###################################
# 先清空GPG代理缓存,确保本次解密必须手动输入密码
echo RELOADAGENT | gpg-connect-agent
# 擦除gpgout目录下的残留临时文件,空目录场景下也不会报错
wipe -rfi ~/programs/utils/scripts/gpg/gpgout/* 2>/dev/null || true
# 执行解密操作
gpg -o ~/programs/utils/scripts/gpg/gpgout/p1.txt -d ~/programs/utils/scripts/gpg/p1.gpg
# 直接输出解密后的密码内容,用绝对路径避免找不到文件
cat ~/programs/utils/scripts/gpg/gpgout/p1.txt
# 查看完成后再次彻底擦除解密生成的临时文件
wipe -rfi ~/programs/utils/scripts/gpg/gpgout/* 2>/dev/null || true
补充说明
  • 如果不想每次都全局清空gpg-agent的缓存,也可以在gpg解密命令后加--no-use-agent参数,强制本次解密不使用代理缓存的密码,效果一致。
  • 注意脚本不要加全局输出重定向,不然你看不到解密后的密码,就达不到方便复制的目的了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 01:45:03