在服务器模式下使用 emacs 中的 ssh 代理



我正在服务器模式下运行 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 下打开的终端。

最新更新