我正在服务器模式下运行 emacs 作为 systemd 用户服务,并希望使用 magit 从经过公钥身份验证的远程存储库中提取。不幸的是,magit(或其 git 子进程(无法使用我已经加载的公钥。显然,我无法从 emacs 的上下文中连接到我的 ssh 代理。
从 emacs 中运行:
~ ssh-add
Could not open a connection to your authentication agent.
是否有一种已知的方法可以解决这个问题,或者我是否必须深入研究 ssh-agent 和客户端的实际通信方式?
我使用keychain
来管理ssh代理。 它启动代理并将相关参数(代理 PID 和套接字(转储到可由 shell 获取的脚本中。 有一个Emacs软件包keychain-environment
可以把它拉到Emacs中。
~/.bash_profile
:
# keychain manages ssh-agents
type keychain >&/dev/null
&& keychain --agents ssh
这将在登录时keychain
启动运行,这将启动ssh-agent
并将其信息转储到文件中。 keychain
是幂等的,因此后续登录(例如使用 ssh
登录(如果它已经在运行,则不会启动新ssh-agent
。
~/.bashrc
:
# keychain keeps track of ssh-agents
[ -f $HOME/.keychain/$HOSTNAME-sh ]
&& . $HOME/.keychain/$HOSTNAME-sh
这允许任何新的 shell 重用代理。 我不认为这实际上与Emacs相关,但显然是有用的。
~/.emacs.d/init.el
:
(require 'keychain-environment)
(keychain-refresh-environment)
这会将代理信息加载到 Emacs 中,以便 Emacs 可以与之通信(或者更准确地说,Emacs 启动的任何ssh
进程都可以看到相关的 env var(。
ssh 代理必须在要使用的进程的父进程中运行。这就是为什么它通常作为窗口管理器设置的一部分启动 - 窗口管理器的所有子进程,即用户运行的终端和程序,将能够使用 ssh-agent。
在您的情况下,您可以在启动 emacs 的 systemd 用户服务中将 ssh-agent 作为父进程运行,但当然您的代理将无法用于其他用途,例如从在您的 wm 下打开的终端。