如何让 pinentry-curses 在正确的 tty 上启动?

如何让 pinentry-curses 在正确的 tty 上启动?

我用于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 时都会获取它。此设置一切正常,但有一个问题。假设我:

  1. 打开终端(在后台启动代理)并开始工作
  2. 一段时间后打开第二个终端
  3. 执行需要在第二个终端中输入密码的操作

此时gpg-agent将开始pinentry-curses提示输入密码,但它将在第一个终端中执行此操作,这会导致其输出与正在运行的任何内容(通常是文本编辑器)混合,无法恢复程序或停止 pinentry(它开始使用 100% cpu)我必须杀死它)。

我一定是在这里做错了什么。有人经历过这个吗?

更新:

我发现这种情况只发生在提示解锁 SSH 密钥时,看起来像,而 PGP 密钥的提示始终在正确的(即当前的)tty 上打开。

答案1

gpg-agent 手册页在该选项下解释了--enable-ssh-supportssh 代理协议无法向代理提供 tty 的名称,因此它默认使用启动它的原始终端。在运行需要在新终端中输入密码的 ssh 命令之前,您需要需要输入

gpg-connect-agent updatestartuptty /bye

在新终端中更新代理关于要使用哪个 tty 或显示器的视图。

答案2

根据上游错误反对 openssh,恰当的方法是将以下内容添加到您的~/.ssh/config

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"

到目前为止,这对我来说非常有效。

相关内容