堡垒主机上的 ssh-agent 密钥与屏幕或 tmux 超时

堡垒主机上的 ssh-agent 密钥与屏幕或 tmux 超时

通常情况下,我会运行 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_SOCKinside的值更新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 值。

相关内容