如何让 ssh-agent 通过 ssh 和 tmux(在 OS X 上)工作?

Ric*_*ich 18 ssh ssh-agent tmux macos

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

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

这个问题表明 screen 存在类似的问题,但我不太了解这个问题,无法在 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"
Run Code Online (Sandbox Code Playgroud)

而通过 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
Run Code Online (Sandbox Code Playgroud)

echo $SSH_AGENT_PID 无论我从哪个 shell 运行它,都不返回任何内容。

mis*_*lav 10

一个优雅的解决方案,摘自 dagit.o

创建 ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
Run Code Online (Sandbox Code Playgroud)

添加 ~/.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
Run Code Online (Sandbox Code Playgroud)


Tre*_*ell 7

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

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

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

  • 这是将这些值放入 *tmux* 会话的合适方法,但所有这些环境变量都应该已经包含在 `update-environment` 的默认值中。OP 应该检查他们的 `update-environment` 值,并可能在已经更改的地方进行更新。 (2认同)
  • 这样做的问题是配置只会在没有 `tmux` 服务器存在时重新执行,违背了重新附加的目的......也许有一个命令行开关来重新更新这些变量? (2认同)

小智 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
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后您可以键入以下命令在当前 shell 中设置 SSH_AUTH_SOCK:

    set_ssh_agent_socket
    
    Run Code Online (Sandbox Code Playgroud)