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


13

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

每当我运行交互式外壳程序时,该源代码便会提供。使用此设置,一切都可以正常工作,但是存在问题。假设我:

  1. 打开终端(在后台启动代理)并开始工作
  2. 过一会儿再打开第二个终端
  3. 进行需要在第二个终端输入密码的操作

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

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

更新:

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


您是否尝试过从登录外壳启动代理,因此仅运行一个代理?
jasonwryan '16

我刚刚尝试过@jasonwryan:对于Linux虚拟终端(年龄),这是相同的事情。顺便提一下,在终端问题中,我指的是终端仿真器窗口。
Rnhmjoj

1
正是export GPG_TTY="$(tty)"为我解决的问题
naisanza

Answers:


11

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

gpg-connect-agent updatestartuptty /bye

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


1
这个答案帮助我充分理解了这一认识:负责的gpg2人并不了解以命令行为中心的工作流/生活方式是什么样的概念。某种程度上,那些通常具有典型计算机用户体验的基本概念的人,在GUI窗口的范围之内开始和结束时,他们不得不做出决定,从而影响到以前可以在命令行上方便使用的工具。
mtraceur

2
@mtraceur并非如此,这是ssh-agent的错误:实际上,当解锁PGP密钥时,gpg2会在正确的tty上显示提示。那些负责ssh-agent的人可能从未想过要切换到其他tty。
Rnhmjoj '18

2
@Rnhmjoj SSH家伙是否应该支持TTY转换用例,而在大多数Unix / Linux历史上都不需要命令行工具?您是否知道针对命令究竟处理了工作流的哪一部分以及由代理处理了哪一部分的设计思想过程和决策的方式?如果是的话,也许您可​​以帮助我看到我所缺少的东西,因为除非没有考虑该体系结构就决定了该架构,否则我什至看不到代理“切换” TTY的需求的清晰路径典型的命令行使用和工作流程。
mtraceur

1
@ArneBabenhauserheide的区别在于,gpg从不要求在错误的终端上输入密码,而gpg2很容易做到。该gpg命令将始终在执行命令的终端上要求输入密码因为实际上创建密码是从进程树完成的。但是gpg2由于无法保证编码,因为它必须要求一个单独的长期运行的代理进程来提示输入口令,并且该代理最初可能是在其他终端上启动的。gpg2代理可以(但没有编码)来解决此问题。
mtraceur

1
@ArneBabenhauserheide除非您询问SSH代理和gpg2之间的区别?因为如果这样的话,所不同的是从来没有要求SSH有特别主动告诉其代理在后台开关端子等工装的这个变态(据我所知-如果它没有那么我有同样的批评为太)。gpg2只有由不了解Linux / Unix工作原理的CLI相关方面并且对使接口和工具适合于任意组合的良好理解的人实施该设计才有意义。
mtraceur

5

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

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

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


1
请注意,GPG_TTY必须将其设置为$(tty)可进行此项工作。
彼得
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.