如何在ssh和tmux中(在OS X上)使ssh-agent工作?


17

我为我的github帐户设置了一个私钥,我认为该密码存储在OS X的钥匙串中。当我打开终端窗口并输入时,我当然不必键入它ssh git@github.com

但是,当我通过ssh会话或在tmux会话中本地运行bash时,每次尝试ssh到github时,都必须输入密码。

这个问题表明屏幕也存在类似的问题,但是我不太了解这个问题,无法在tmux中修复它。还有这个网页,其中包括相当复杂的解决方案,但zsh的。

编辑

响应@Mikel的答案,从本地终端我得到以下输出:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

而通过ssh或tmux我得到:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID 无论我从那里运行它,什么都不返回。


typeset -p SSH_AUTH_SOCK
Mikel

bash: typeset: SSH_AUTH_SOCK: not found来自ssh / tmux的@Mikel 。如有必要,我今晚将在本地尝试。
Rich

@Mikel我已将该命令的输出添加到问题中。
Rich

AFAIK,问题和答案不是特定于OS X的。这与避免某些非OS X特定的复制有关,即superuser.com/q/334975/46794superuser.com/q/479796/46794
Blaisorblade

@Blaisorblade我的印象是我的密码存储在OS X钥匙串中(尽管现在我不记得为什么我相信这种情况了)。那不对吗?
Rich

Answers:


4

我的同事创建了一些bash函数来帮助查找实时代理:https : //github.com/wwalker/ssh-find-agent

他主要将其用于系统之间的连接(笔记本电脑至台式机等),但是我最常将其用于本地tmux会话,在该会话中您从窗口管理器(本身为OS X)注销/登录。

用法

  1. 下载ssh-find-agent.bash(git clone git://github.com/wwalker/ssh-find-agent.git有效)。

  2. 将以下内容添加到〜/ .bashrc中:

    . /path/to/ssh-find-agent.bash
    
  3. 然后,您可以键入以下命令在当前shell中设置SSH_AUTH_SOCK:

    set_ssh_agent_socket
    

我接受了这个答案,而不是任何其他人的可能的工作,因为它并不需要SSH代理转发,这是更好地为我的目的。谢谢!
2014年

8

一个很好的解决方案,来自dagit.o

创建 ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

添加 ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock

7

在您的.tmux.conf配置文件中,添加以下行:

设置-g更新环境“ SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION”

这将导致这些环境变量从您的主shell复制到tmux中打开的任何shell,然后ssh-agent可以在这些tmux shell中正常工作。


2
这是使这些值进入tmux会话的适当方法,但是所有这些环境变量都应该已经包含在默认值中update-environment。OP应该检查其update-environment值,并可能在任何已更改的地方进行更新。
克里斯·约翰森

1
嗯..进一步挖掘之后,我同意-列出的设置已经在默认设置中,并且如果我在没有.tmux.conf文件的情况下运行tmux,则一切正常。如果我删除了.tmux.conf文件中引用的行,那对我也很有效,尽管以前没有。很明显,偶尔还会有其他地方出问题。也许与远程挂起/恢复或附加/分离或sshing到tmux会话有关。如果我发现可重现的因素,我将睁大眼睛并进行更新。
Trevor Powell

update-environment设置正确。但是,问题仍然会发生。
Rich

2
问题在于,只有在不存在tmux服务器的情况下,配置才会重新执行,这违背了重新连接的目的……也许有一个命令行开关可以重新更新这些变量?
Tobias Kienzler 2013年


2

不确定使用的是bash还是其他shell,但是此人的tmux设置看起来像可以用于bash。就个人而言,我在oh-my-zsh中使用zsh ,我发现在添加后ssh-agent开始在tmux中工作

zstyle :omz:plugins:ssh-agent agent-forwarding on

到我的.zshrc文件,并在正在运行的zsh会话中重新加载配置。我还找到了这个人的面向zsh的解决方案,但事实证明这对我来说是不必要的。


1

是什么

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

打印?

在普通终端中运行它,然后在tmux会话中运行它。他们应该打印相同的东西。


我将对这些命令的响应添加到了问题中。我还意识到,当我通过ssh登录(不使用tmux)时,也会出现此问题,并已相应地编辑了问题。
Rich

4
ssh简单。打开代理转发。要做到这一点最简单的方式运行ssh -A,而不是ssh。使用别名,这样您就不必每次都键入它,也不必将其放在您的中.SSH/config
Mikel

太好了,谢谢。那为ssh工作。有什么想法如何在tmux中修复它吗?
丰富

0

解决方案很多,但最简单的解决方案是在Hans Ginzel于2016年1月8日对2014年1月27日一个相关StackOverflow问题的回答中找到的。只需将以下内容添加到您的shell ~/.profile或类似文件中:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

无需定义多行功能或创建新的临时文件。如果您不想使用别名ssh,只需将其更改为fixssh&& ssh在最后删除,然后fixssh在您尝试ssh从重新连接的tmux会话中运行时运行。

汉斯·金泽尔(Hans Ginzel)的回答表明,运行tmux需要“更新版本” show-env -s。这在tmux 2.7中对我有效,并且在我阅读changelog时-s是在2008年6月3日tmux 0.3发布之前添加的。tmux 2.3(2016年9月29日)在Debian稳定版中。

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.