Механизм сохранения активности для ssh поверх ssh в Paramiko

Я использую интерактивную оболочку Paramiko (метод invoke_shell()) для открытия сеанса между моим локальным хостом и удаленным хостом и отправки ему команд.
Иногда мне нужно открыть с моего удаленного хоста ssh-соединение с другим удаленным хостом (это похоже на мост или SSH через SSH от локального хоста к remote_host_2 через remote_host_1).

Для лучшего понимания вот картинка, как она должна себя вести:

| local host |  -(1)->    | remote host |  -(2)->   | destination host |   

1: открыт с использованием метода invoke_shell() paramiko, поэтому будет создан некоторый paramiko.Channel объект.
2: открыт с помощью команды Linux, т. е. ssh remote_user@remote_ip

Это делается таким образом, потому что иногда у меня нет прямого подключения к destination host, и в случае, если вы открываете его через remote host, пользователь должен принять решение (ввести другой password, ответить yes/no на некоторые вопросы и т. Д.)

Теперь мой вопрос касается поддержания соединения.
Я прочитал о keep_alive механизме, который есть у paramiko, но он не выполняет то, что я хочу, потому что paramiko знает, что мое соединение заканчивается на remote_host, а не на destination host, поэтому, если destination host мертв, я буду не получит никаких уведомлений об этом, и выполнение команд не будет выполнено.

Единственное решение, которое пришло мне в голову, - это отправить пустую команду на этот канал (\n) и попытаться прочитать вывод канала перед выполнением на нем желаемой команды. но это означает, что я могу влиять на свой канал с одной стороны, и время выполнения моей команды теперь вдвое больше.

Теперь у меня вопрос: есть ли другой способ установить это соединение, чтобы этот механизм сохранения активности работал?

p.s. Я читал, что существует некий ServerAliveInterval=30 флаг, который может помочь мне поддерживать ssh интерактивное соединение, но я не понимаю, как я могу использовать его, чтобы убедиться, что оно не стало мертвым.


person ms_stud    schedule 14.06.2020    source источник


Ответы (1)


Правильный способ - реализовать переход с помощью переадресации портов.
См. Подключение к серверу через другой сервер с помощью Paramiko

Тогда у вас будет полный контроль над обоими соединениями, и вы сможете использовать собственные функции Paramiko, чтобы поддерживать соединение и проверять его статус.

person Martin Prikryl    schedule 14.06.2020