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

Jer*_*con 9 ssh gnu-screen 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 上无效。

请帮忙!

che*_*ner 12

每次 ssh into 时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
Run Code Online (Sandbox Code Playgroud)

ssh 进入后立即执行该脚本bastion01,但在重新附加到 tmux 会话之前。然后,在尝试从 inside 任何地方 ssh 之前tmux,运行以下命令:

source ~/.auth_ssh
Run Code Online (Sandbox Code Playgroud)

每个tmux窗口都有自己的环境,因此您需要在尝试运行 ssh 的每个窗口中运行该环境。为简单起见,您可以使用别名 ssh 来为您执行此操作:

alias ssh="source ~/.auth_ssh; ssh"
Run Code Online (Sandbox Code Playgroud)

注意:这是对我们在工作中用于更新 SSH 授权信息的脚本的过度简化。如果它不能正常工作,我希望这至少可以为您提供足够的信息来谷歌搜索更好的解决方案(或其他人在这里发布更好的解决方案)。