如何让 pinentry-curses 从正确的 tty 开始?

Rnh*_*joj 15 tty gpg pinentry

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
Run Code Online (Sandbox Code Playgroud)

每当我运行交互式 shell 时,它就会被获取。使用此设置一切正常,但存在问题。假设我:

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

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

我一定在这里做错了什么。任何人都经历过这种情况?

更新:

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

meu*_*euh 15

GPG代理手册页的选项下解释--enable-ssh-support了SSH代理协议不能够提供TTY给代理人的姓名,所以它默认使用它在启动原来的终端。运行需要一个ssh命令之前您需要在新终端中输入密码

gpg-connect-agent updatestartuptty /bye
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案帮助我完全凝结了这种认识:负责`gpg2` 的人不知道拥有以命令行为中心的工作流/生活方式是什么样的。不知何故,典型计算机用户体验的*基本概念*在 GUI 窗口范围内开始和结束的人必须做出影响以前在命令行上舒适使用的工具的决定。 (3认同)
  • @Rnhmjoj SSH 人员是否应该支持 TTY 切换用例,而大多数 Unix/Linux 历史上都不需要命令行工具?您是否知道对于工作流的哪一部分由命令处理而哪一部分由代理处理的设计思维过程和决策是如何完成的?如果你是,也许你可以帮我看看我遗漏的东西,因为我看不到一个清晰的路径,除非架构已经决定,否则代理“切换”TTY的*需要*甚至会出现不考虑典型的命令行使用和工作流程。 (3认同)
  • @mtraceur 不是真的,这是 ssh-agent 的错:实际上 gpg2 会在解锁 PGP 密钥时在右侧 tty 上显示提示。负责 ssh-agent 的人可能从未想过切换到不同的 tty。 (2认同)
  • @ArneBabenhauserheide 除非您询问 SSH 代理和 gpg2 之间的区别?因为如果是这样,那么不同之处在于 SSH 从来不需要这种变态的其他工具必须主动告诉其代理专门在后台切换终端(据我所知 - 如果是这样,那么我对 *it 有同样的批评* 也)。`gpg2` 设计只有在由不了解 Linux/Unix 工作方式的 CLI 相关方面的人实现时才有意义,并且对什么使接口和工具适合以任意组合进行组合没有很好的理解。 (2认同)

sma*_*kov 10

根据针对 openssh的上游错误正确的方法是将以下内容添加到您的~/.ssh/config:

Match host * exec "gpg-connect-agent UPDATESTARTUPTTY /bye"
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,`GPG_TTY` 必须设置为 `$(tty)` 才能使其工作。 (2认同)
  • 非常感谢您的指点! (2认同)