Тайм-аут ключа ssh-agent с экраном или tmux на хосте бастиона

8

Обычно у меня работает ssh-agent, я захожу по ssh на свой бастионный хост, затем открываю сеанс tmux и через него подключаюсь к другим компьютерам Переадресация ключей работает для любых сессий, которые я открываю с этого момента.

Если я возобновляю сеанс tmux после закрытия терминала, сна моего ноутбука, что бы то ни было, переадресация моих ключей на моих сессиях бастиона все еще работает, как и переадресация на любых новых сессиях. Однако существующие не работают.

В моем bashrc есть небольшая вещь, которая поддерживает переадресацию ключей при возобновлении работы с tmux, но у меня возникают проблемы с поиском, как заставить его работать на сеансах, открытых в tmux.

Например, у меня есть bastion01, dbhost01, dbhost02, webhost01 и webhost02.

Если я открываю соединение с bastion01, запускаю там tmux, а затем соединяюсь с dbhost01 и переадресация webhost01 работает. Если я закрываю это соединение, повторно подключаюсь и присоединяю свой существующий сеанс tmux, а затем добавляю соединения в dbhost02 и webhost02, переадресация ключей работает в полях 02, но не в 01.

Пожалуйста помоги!

Jericon
источник

Ответы:

11

Каждый раз, когда вы входите в ssh bastion01, открывается новый сокет для обработки переадресации ключей. Вы можете увидеть имя файла в переменной окружения SSH_AUTH_SOCK. При запуске tmuxзначение этой переменной среды включается в tmuxглобальную среду, которая наследуется всеми оболочками, запущенными в этом сеансе.

Теперь, когда вы переподключаетесь к bastion01более поздней версии , для обработки переадресации ключей выделяется другой сокет (так как это новый ssh-сеанс). Вы можете убедиться в этом, изучив значение SSH_AUTH_SOCKдо повторного присоединения к tmuxсеансу и после. Для того, чтобы переадресация ключей работала внутри 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 (или кто-то еще публикует лучшее решение здесь).

chepner
источник