У меня есть сценарий использования, когда с хоста «A» мне нужно подключиться по ssh к хосту «D» через хосты «B» и «C» (я хотел бы иметь возможность применить решение для стольких промежуточных хостов, скольковозможно):
A ==> B ==> C ==> D
Как только соединение установлено с D, я хотел бы запустить списоккоманд ["comm1", "comm2", "comm3"] и получить ответ как ["output1", "output2", "output3"] на хосте A. Единственная стратегия, которую я придумал, была, как только вы приедете нахост D:
- Выполнение connection.invoke_shell ()
- Отправка comm1, опрос канала для вывода, сбор ответа и вставка его в пустой список
- Закройте канал, созданный connection.invoke_shell ()
- Создайте новый интерактивный канал оболочки
- Повторите шаги 1–5 для comm2 и comm3
Когда я разработалон понял, что попытка восстановить канал интерактивной оболочки приведет к ошибке EOFError.У меня есть предчувствие, что закрытие канала на шаге 3 завершает весь сеанс SSH на всем пути от хоста A к хосту D.
Однако необходимо закрыть канал и запустить новую интерактивную оболочкув противном случае для каждой команды вы будете читать полный вывод канала (содержащий выходные данные всех трех команд) как один большой блок текста, который затем необходимо обработать с использованием скрининга экрана, что не является идеальным.Возможен ли приведенный выше алгоритм?Если да, то как можно реализовать это с paramiko и почему я получаю исключение EOFError?
Я также пытался добиться этого с помощью Fabric.Это работало с некоторыми устройствами, но не на cisco.Причина в том, что Fabric также использует функцию удаленного выполнения команд ssh в paramiko, которая не поддерживается некоторыми устройствами Cisco (см. Client.exec_command).Поэтому интерактивный сеанс был единственным путем.