Я использую интерактивную оболочку 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
интерактивное соединение, но я не понимаю, как я могу использовать его, чтобы убедиться, что оно не стало мертвым.