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

cho*_*ger 5 emacs ssh ssh-agent systemd

我在服务器模式下运行emacs作为systemd用户服务,并希望使用magit从pubkey认证的远程存储库中提取.不幸的是,magit(或它的git子进程)无法使用我已经加载的公钥.显然,我无法从emacs的上下文中连接到我的ssh-agent.

从emacs中运行:

~ ssh-add  
Could not open a connection to your authentication agent.
Run Code Online (Sandbox Code Playgroud)

有没有一种已知的方法来解决这个问题,还是我必须深入研究ssh-agent和客户端实际上的沟通方式?

jpk*_*tta 5

keychain用来管理 ssh 代理。它启动代理并将相关参数(代理 PID 和套接字)转储到可由 shell 获取的脚本中。有一个 Emacs 包keychain-environment可以将它拉入 Emacs。

~/.bash_profile

# keychain manages ssh-agents
type keychain >&/dev/null \
    && keychain --agents ssh
Run Code Online (Sandbox Code Playgroud)

keychain在登录时开始运行,它将启动一个ssh-agent并将其信息转储到一个文件中。 keychain是幂等的,因此后续登录(例如使用 登录ssh)将不会启动新的(ssh-agent如果它已经在运行)。

~/.bashrc

# keychain keeps track of ssh-agents
[ -f $HOME/.keychain/$HOSTNAME-sh ] \
    && . $HOME/.keychain/$HOSTNAME-sh
Run Code Online (Sandbox Code Playgroud)

这允许任何新 shell 重用代理。我认为这实际上与 Emacs 无关,但显然很有用。

~/.emacs.d/init.el

(require 'keychain-environment)
(keychain-refresh-environment)
Run Code Online (Sandbox Code Playgroud)

这会将代理信息加载到 Emacs 中,因此 Emacs 可以与其对话(或者更准确地说,ssh由 Emacs 启动的任何进程都可以看到相关的 env vars)。


Tim*_*m X 2

ssh-agent 必须在您要使用它的进程的父进程中运行。这就是为什么它通常作为窗口管理器设置的一部分启动 - 窗口管理器的所有子进程(即用户运行的终端和程序)将能够使用 ssh 代理。

在您的情况下,您也许可以将 ssh-agent 作为启动 emacs 的 systemd 用户服务中的父进程运行,但是您的代理当然不会与其他用途一起使用,例如在您的 wm 下打开的终端。