восстановление интерактивной оболочки в многоскачковых SSH-соединениях - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть сценарий использования, когда с хоста «A» мне нужно подключиться по ssh к хосту «D» через хосты «B» и «C» (я хотел бы иметь возможность применить решение для стольких промежуточных хостов, скольковозможно):

A ==> B ==> C ==> D

Как только соединение установлено с D, я хотел бы запустить списоккоманд ["comm1", "comm2", "comm3"] и получить ответ как ["output1", "output2", "output3"] на хосте A. Единственная стратегия, которую я придумал, была, как только вы приедете нахост D:

  1. Выполнение connection.invoke_shell ()
  2. Отправка comm1, опрос канала для вывода, сбор ответа и вставка его в пустой список
  3. Закройте канал, созданный connection.invoke_shell ()
  4. Создайте новый интерактивный канал оболочки
  5. Повторите шаги 1–5 для comm2 и comm3

Когда я разработалон понял, что попытка восстановить канал интерактивной оболочки приведет к ошибке EOFError.У меня есть предчувствие, что закрытие канала на шаге 3 завершает весь сеанс SSH на всем пути от хоста A к хосту D.

Однако необходимо закрыть канал и запустить новую интерактивную оболочкув противном случае для каждой команды вы будете читать полный вывод канала (содержащий выходные данные всех трех команд) как один большой блок текста, который затем необходимо обработать с использованием скрининга экрана, что не является идеальным.Возможен ли приведенный выше алгоритм?Если да, то как можно реализовать это с paramiko и почему я получаю исключение EOFError?

Я также пытался добиться этого с помощью Fabric.Это работало с некоторыми устройствами, но не на cisco.Причина в том, что Fabric также использует функцию удаленного выполнения команд ssh в paramiko, которая не поддерживается некоторыми устройствами Cisco (см. Client.exec_command).Поэтому интерактивный сеанс был единственным путем.

1 Ответ

0 голосов
/ 08 февраля 2019

Для простоты рассмотрим случай отсутствия перехода:

$ ssh -i key user@host 'echo command; echo control'
command
control
$ ssh -i key user@host 'echo command; echo control' >/dev/null
$ ssh -i key user@host 'echo command; echo 1>&2 control' >/dev/null
control

Другими словами, у нас есть два выходных канала ...

...