我正在尝试设置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
重新读取信息 - 如果两个循环没有帮助,那么第三个循环也没有帮助。
请注意,主机名内置于文件名中,因为您可能在不同计算机之间共享您的家庭。
请随意改进以消除可能丑陋的错误输出,并可能在丢失目录时创建该目录。