通常情况下,我会运行 ssh-agent,然后通过 ssh 连接到我的堡垒主机,然后打开 tmux 会话并通过它连接到其他机器。从那时起,密钥转发适用于我打开的任何会话。
如果我在关闭终端、让笔记本电脑休眠等情况下恢复 tmux 会话,我的堡垒会话上的密钥转发仍然有效,任何会话上的转发也一样新的会话。但是,现有的会话不起作用。
我的 bashrc 中有一个小东西,可以在我恢复 tmux 时保持密钥转发正常工作,但我无法弄清楚如何让它在 tmux 中打开的会话中继续工作。
例如,我有 bastion01、dbhost01、dbhost02、webhost01 和 webhost02。
如果我打开与 bastion01 的连接,在那里启动 tmux,然后连接到 dbhost01,并且 webhost01 转发可以正常工作。如果我关闭该连接,重新连接并附加我现有的 tmux 会话,然后添加与 dbhost02 和 webhost02 的连接,密钥转发可以在 02 台机器上工作,但在 01 台机器上不起作用。
请帮忙!
答案1
每次您通过 ssh 进入 时bastion01
,都会打开一个不同的套接字来处理密钥转发。您可以在环境变量 中看到文件名SSH_AUTH_SOCK
。启动 时tmux
,该环境变量的值包含在tmux
的全局环境中,该会话中启动的任何 shell 都会继承该环境变量。
现在,当您bastion01
稍后重新连接到 时,将分配一个不同的套接字来处理您的密钥转发(因为这是一个新的 ssh 会话)。您可以通过检查SSH_AUTH_SOCK
重新连接到tmux
会话之前和之后的值来查看这一点。为了使密钥转发在 inside 中工作tmux
,您需要将SSH_AUTH_SOCK
inside的值更新tmux
为当前 ssh 会话正在使用的套接字的名称。
一个快速而简单的方法是编写一个简短的脚本,将这个新值保存到文件中,然后在tmux
您将要ssh
使用的任何窗口中执行该脚本。
#!/bin/bash
echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/.auth_ssh
在您 ssh 进入 后立即执行该脚本bastion01
,但在您重新连接到 tmux 会话之前。然后,在您尝试从 内部 ssh 到任何地方之前tmux
,运行以下命令:
source ~/.auth_ssh
每个tmux
窗口都有自己的环境,因此您需要在每个尝试运行 ssh 的窗口中运行该环境。为简单起见,您可以使用 ssh 别名来为您执行此操作:
alias ssh="source ~/.auth_ssh; ssh"
注意:这是我们在工作中用来更新 SSH 授权信息的脚本的简化版本。如果它不能正常工作,我希望这至少能为您提供足够的信息,以便您在 Google 上找到更好的解决方案(或者其他人在此处发布更好的解决方案)。
答案2
更清洁、更强大的解决方案,改编自https://superuser.com/a/439006/161249
在遥控器上,在~/.ssh/rc
:
# to reconnect ssh-agent through a disconnected session
if [ -n "${SSH_AUTH_SOCK}" ]; then
ln -snf "${SSH_AUTH_SOCK}" "${HOME}/.ssh/tmux_ssh_auth_sock" # symlink read in ~/.tmux.conf
fi
# vim: ft=bash
以及~/.tmux.conf
:
# to reconnect ssh-agent through a disconnected session
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/tmux_ssh_auth_sock # symlink set by ~/.ssh/rc
引用@Arcege:
使用“别名”解决方案的问题是......屏幕上运行的进程现在在远程端具有相同的 SSH_AUTH_SOCK 值。