我用于gpg-agent
管理 PGP e SSH 身份。代理是用这样的脚本启动的
gpg_agent_env="$XDG_CACHE_HOME/gpg-agent.env"
export GPG_TTY="$(tty)"
if ! ps -U "$USER" -o ucomm | grep -q gpg-agent; then
eval "$({gpg-agent --daemon | tee $gpg_agent_env} 2> /dev/null)"
else
source "$gpg_agent_env" 2> /dev/null
fi
每当我运行交互式 shell 时都会获取它。此设置一切正常,但有一个问题。假设我:
- 打开终端(在后台启动代理)并开始工作
- 一段时间后打开第二个终端
- 执行需要在第二个终端中输入密码的操作
此时gpg-agent
将开始pinentry-curses
提示输入密码,但它将在第一个终端中执行此操作,这会导致其输出与正在运行的任何内容(通常是文本编辑器)混合,无法恢复程序或停止 pinentry(它开始使用 100% cpu)我必须杀死它)。
我一定是在这里做错了什么。有人经历过这个吗?
更新:
我发现这种情况只发生在提示解锁 SSH 密钥时,看起来像这,而 PGP 密钥的提示始终在正确的(即当前的)tty 上打开。
答案1
这gpg-agent 手册页在该选项下解释了--enable-ssh-support
ssh 代理协议无法向代理提供 tty 的名称,因此它默认使用启动它的原始终端。在运行需要在新终端中输入密码的 ssh 命令之前,您需要需要输入
gpg-connect-agent updatestartuptty /bye
在新终端中更新代理关于要使用哪个 tty 或显示器的视图。
答案2
根据上游错误反对 openssh,恰当的方法是将以下内容添加到您的~/.ssh/config
:
Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
到目前为止,这对我来说非常有效。