Непрямой ssh, соединение закрыто после одной команды

Я пытался выполнить несколько команд через несколько SSH, в основном:

ssh -t host1 ssh -t host2 ssh -t host3 'cmd1; cmd2; Cmd3'

Я хочу выполнить все команды на конечном хосте (host3). Но что произойдет, если я воспользуюсь приведенной выше строкой, то соединение с host3 и host2 закрылось сразу после "cmd1;"

Например, если я использую имя хоста для cmd1, cmd2 и cmd3, результат будет

host3
Соединение с host3 закрыто.
Соединение с host2 закрыто.
host1
host1
Соединение с host1 закрыто.

Если я использую двойные кавычки следующим образом

ssh -t host1 "ssh -t host2 ssh -t host3 'cmd1; cmd2; cmd3'"
или же
ssh -t host1 ssh -t host2 "ssh -t host3 'cmd1; cmd2; cmd3'"

Я получаю вывод:

host3
Соединение с host3 закрыто.
host2
host2
Соединение с host2 закрыто.
Соединение с host1 закрыто.

Может ли кто-нибудь объяснить это мне? и как я могу получить все команды, выполняемые на host3

1 ответ

Все это занимает много цитат:

ssh -t host1 'ssh -t host2 "ssh -t host3 '"'"'cmd1; cmd2; cmd3'"'"'"'

То, что я сделал здесь, было просто взять вашу последнюю команду и добавить ' вокруг него. Однако что-то еще должно быть соответствующим образом скорректировано. Любой ранее существующий ' внутри той части, которую я положил ' вокруг должно быть заменено '"'"'

Причина замены ' с '"'"' работает это:

  • Первый ' завершает строку в кавычках.
  • Первый " начинается новая строка в кавычках "
  • Середина ' не интерпретируется оболочкой, а только как литерал.
  • Последний " заканчивает строку в кавычках "
  • Последний ' начинается новая строка в кавычках.
  • Три строки автоматически объединяются оболочкой.
Другие вопросы по тегам