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


8

正常情况下,我正在运行ssh-agent,然后ssh到我的堡垒主机,然后打开一个tmux会话,并通过该会话连接到其他服务器。从那时起,任何我打开的会话都可以使用密钥转发。

如果我在关闭终端后继续我的tmux会话,睡着我的笔记本电脑,无论如何,我在堡垒会话上的密钥转发仍然有效,在任何会话上转发也是如此。现有的不起作用,但是。

我的bashrc中有一个小东西,当我恢复tmux时,它可以使密钥转发正常工作,但是我很难弄清楚如何使其在tmux中打开的会话中继续工作。

例如,我有bastion01,dbhost01,dbhost02,webhost01和webhost02。

如果我打开了与bastion01的连接,请在此处启动tmux,然后连接到dbhost01和webhost01转发工作。如果我关闭该连接,重新连接并附加现有的tmux会话,然后将连接添加到dbhost02和webhost02,则密钥转发在02框上起作用,但不适用于01框。

请帮忙!

Answers:


11

每次ssh进入时bastion01,都会打开一个不同的套接字来处理密钥转发。您可以在环境变量中看到文件名SSH_AUTH_SOCK。启动时tmux,该环境变量的值包含在tmux的全局环境中,该全局环境由在该会话中启动的所有shell继承。

现在,当您bastion01稍后重新连接时,将分配一个不同的套接字来处理密钥转发(因为这是一个新的ssh会话)。通过检查SSH_AUTH_SOCK重新连接到tmux会话之前和之后的值,可以看到此信息。为了使密钥转发在内部起作用tmux,您需要将SSH_AUTH_SOCK内部的值更新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提供更好的解决方案(或者其他人在此处发布更好的解决方案)。

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.