Magit,如何使用系统的ssh代理并且不要求输入密码


19

我已经在Google上搜索并阅读了Magit的FAQ和Wiki,但仍然无法弄清楚,我发现的只是有关Windows的答案...

如何配置Magit以使用正在运行的ssh-agent会话,并且在进行推送时不要求输入密码。

我正在运行linux,并使用终端启动ssh-agent,然后解锁我的密钥,这使我可以进行git push等操作,而无需每次输入密码。

环保:
Arch Linux
Emacs 24.4

带有密钥的ssh-agent,用于在打开的第一个终端上解锁。

编辑:我的意思是使用密码短语,您知道ssh密钥等。
我正在推动Bitbucket,但我确实相信关键问题是Magit并未在说/识别我的ssh代理。
也许要设置一些配置,以告诉我我正在运行它??


其实也有同样的问题。
emacsomancer,2015年

什么是远程URL?http://或git://吗?
Nsukami _

在这种情况下,git@bitbucket.org的设置如下:url = git@bitbucket.org:
Andres

您能告诉我们Emacs在返回时返回什么M-x getenv SSH_AGENT_PID吗?M-x getenv SSH_AUTH_SOCK
Nsukami _

SSH_AGENT_PID = 602 SSH_AUTH_SOCK = /tmp/ssh-13kI6AaYvgji/agent.601
Andres

Answers:


13

好吧,事实证明,这比我要大得多。而且,对于我可以收集到的信息,台式机,ssh-agent和emacs的结合并没有更好的解决方案。

问题1
XFCE正在使用会话启动它自己的ssh-agent,而实际上并未在任何地方说出来,这导致系统具有1个未使用的全局ssh-agent和我的shell特定的未锁定代理。
在不同的DE上,您可能会遇到相同的问题,并且需要找到详细信息以禁用代理自动启动。

解决方案1
运行此命令以禁用启动ssh-agent

xfconf-query -c xfce4-session -p /startup/ssh-agent/enabled -n -t bool -s false

问题2
现在Emacs没有设置任何SSH_AGENT_PIDSSH_AUTH_SOCK变量,因此在加载的环境中什么也没有。显然,Magit仍然要求提供密钥,因为它不知道我们启动的新ssh-agent

解决方案2
我们需要让Emacs从环境中获取这些新变量,但是,当然没有直接的方法。
输入:exec-path-from-shell,它允许您从shell中获取环境变量。所以。

  1. 以首选方式安装exec-path-from-shell软件包。
  2. 将以下代码添加到init.el中,以便在启动Emacs时加载它。

(require 'exec-path-from-shell) (exec-path-from-shell-copy-env "SSH_AGENT_PID") (exec-path-from-shell-copy-env "SSH_AUTH_SOCK")

谢谢你们对查看SSH _ **变量的建议,这为我指明了正确的方向。


您是否对XFCE的代理人不满意并想自己经营,有任何特殊原因吗?放弃似乎更简单的解决方案。
三人房

我不总是运行XFCE,也不关心台式机如何管理它,我更喜欢从oh-my-zsh处理它的插件。因此,对于我来说,跳过默认用例会更容易。(当然,我对代理人的了解不多……但是我并不是真的想花时间思考的事情)
Andres

也许Zsh应该识别代理已经在运行的情况,并顺应此事。但是显然,这在这里变得不合时宜。
2015年

1
也许应该将ssh-agency扩展为在类似Unix的系统上工作。
npostavs 2015年

7

懒惰的另一种解决方案是只使用处理这种情况的软件包(设置Emacs的与钥匙串相关的环境变量):

  1. 安装并将其添加到init.el软件包keychain-environment中
  2. 运行M-x keychain-refresh-environment,现在应该可以了。
  3. 放置(keychain-refresh-environment)在您的init.el中,因此重新启动Emacs后解决方案可以工作

假设您的ssh-agent已配置并正在运行,仅此而已。

从包的评论来看,确实是个不错的描述:

钥匙串是管理ssh-agent和gpg-agent的脚本。它通常从外壳程序的初始化文件运行。它允许您的shell和cron作业共享一个ssh-agent和/或gpg-agent。

运行钥匙串时,它将检查正在运行的代理,否则将启动它们。它将代理的环境变量保存到〜/ .keychain /中的文件中,以便后续的shell可以获取这些文件。

当在X11下而不是直接从终端启动Emacs时,不会设置这些变量。该库查找由钥匙串创建的这些文件,然后相应地设置Emacs的环境变量。它实际上并没有运行钥匙串,因此您仍然必须首先从登录shell运行它。

要使用它,请在初始化文件中运行“ keychain-refresh-environment”功能。如果启动Emacs时尚未运行钥匙串,则以后也可以交互地调用该函数。

另请参阅:http : //www.funtoo.org/wiki/Keychain


1
这正是我已经使用过的需要的东西keychain
xji

1

FWIW keychain现在有一个--systemd开关,它将把变量注入到systemd用户环境中。

我找到的最简单的解决方案是添加eval "$(keychain --eval --quiet --noask --systemd keys...)"到从systemd单元运行的脚本中,以启动Emacs服务器。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.