在不同会话之间使用 gpg-agent

在不同会话之间使用 gpg-agent

我正在尝试设置gpg-agent

当我登录到我的计算机(通过 SSH)并调用 时gpg,它每次都会要求输入密码(它不会gpg-agent自动启动)。

当我开始gpg-agent手动使用时:

eval "$(gpg-agent --daemon)"

然后下一次调用gpg实际上会启动代理,输入密码一次后,我就可以在没有密码的情况下使用 gpg。另外,我看到已经创建了一个套接字$HOME/.gnupg/S.gpg-agent=

当我注销并再次登录(ssh)时,我看到套接字仍然存在$HOME/.gnupg/S.gpg-agent=ps显示代理正在运行,但每次调用都gpg要求输入密码,就好像没有代理一样。

我已将此添加到我的.bashrc

GPG_TTY=$(tty)
export GPG_TTY

但这似乎没有帮助

我发现这种行为gpg-agent非常令人困惑。我很熟悉,ssh-agent而且行为简单易懂。

我怎样才能使用gpg-agent与我使用相同的方式ssh-agent

作为比较,其行为如下ssh-agent

首次启动计算机并登录后,我ssh-add手动启动并输入密码短语一次。

然后,每次登录我的机器(X、控制台、ssh...)时,我都可以使用代理(我不需要再次输入密码)。这是通过添加以下行来完成的.bashrc

export SSH_AUTH_SOCK="$(find /tmp/ssh-*/agent.* -uid $(id -u) -type s -print -quit 2>/dev/null)"

答案1

gpg不寻找套接字(这与新版本2.1不同)而是寻找环境变量GPG_AGENT_INFO。这不是在登录时设置的。这就是问题所在。显然,您可以选择use-standard-socket使gpg-agent.conf套接字名称始终相同。

您应该在登录脚本中设置变量,然后运行一个简单的脚本来检查是否gpg-agent正在运行:

export GPG_AGENT_INFO=/path/to/your/HOME/.gnupg/S.gpg-agent:42:1
gpg-connect-agent /bye &>/dev/null || gpg-agent --daemon &>/dev/null

那是使用的部分gpg。对于 SSH,您还需要SSH_AUTH_SOCK.设置这两个变量的最简单方法是添加行

write-env-file "${HOME}/.gpg-agent-info

到配置文件gpg-agent.conf并在上述之后运行此脚本:

. "${HOME}/.gpg-agent-info"
export SSH_AUTH_SOCK

手册页对此进行了解释gpg-agent

答案2

可悲的是,另一个答案中的解决方案对我不起作用。在我这边,gpg-agent --daemon忽略GPG_AGENT_INFO环境并始终定义它自己的新进程,因此每次登录都会创建它自己的永久运行的进程。

但下面的行做到了:

for a in . .; do . "${HOME}/.gnupg/pg-agent-info.`uname -n`"; gpg-connect-agent /bye && break; gpg-agent --daemon >"${HOME}/.gnupg/pg-agent-info.`uname -n`"; done

  • 这假设您有一个$HOME/.gnupg目录。如果没有,请使用以下命令创建它mkdir ~/.gnupg

下面是它的工作原理:

  • 它首先获取正在运行的代理设置的旧输出
  • 如果这仍然有效,则使用它
  • 否则它会启动一个新的守护进程并记住“${HOME}/.gnupg/pg-agent-info.HOSTNAME”中的设置
  • then中的第二个循环for重新读取信息
  • 如果两个循环没有帮助,那么第三个循环也没有帮助。

请注意,主机名内置于文件名中,因为您可能在不同计算机之间共享您的家庭。

请随意改进以消除可能丑陋的错误输出,并可能在丢失目录时创建该目录。

相关内容