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

时间:2017-02-09 12:27:49

标签: ssh emacs systemd ssh-agent

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

在emacs中运行:

~ ssh-add  
Could not open a connection to your authentication agent.

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

2 个答案:

答案 0 :(得分:3)

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

〜/ .bashrc中:

# keychain keeps track of ssh-agents
[ -f $HOME/.keychain/$HOSTNAME-sh ] \
    && . $HOME/.keychain/$HOSTNAME-sh

〜/ .bash_profile中:

# keychain manages ssh-agents
type keychain >&/dev/null \
    && keychain --agents ssh

〜/ .emacs.d / init.el:

(require 'keychain-environment)
(keychain-refresh-environment)

答案 1 :(得分:2)

ssh-agent必须在要使用它的进程的父进程中运行。这就是它经常作为窗口管理器设置的一部分启动的原因 - 窗口管理器的所有子流程,即用户运行的终端和程序,都能够使用ssh-agent。

在您的情况下,您可以将ssh-agent作为启动emacs的systemd用户服务中的父进程运行,但当然您的代理将无法用于其他用途,例如在您的wm下打开的终端。