Как выполнить многострочную команду ssh, сохраненную в переменной

Как выполнить многострочную команду ssh, сохраненную в переменной

Контекст: Я пытаюсь выполнить ряд команд на удаленной машине, к которой у меня нет прямого доступа. Сначала мне нужно подключиться по SSH к шлюзу, а затем подключиться по SSH оттуда и выполнить команды.

По сути, мне нужен способ упаковки набора команд, которые я могу передать через любое количество уровней ssh. Можно ли это сделать? Я подозреваю, что лучшим ответом будет использование scp для копирования скрипта, а затем его запуска, что является вариантом.

Обратите внимание, что я использовал команду hostname как способ показать, что происходит — это не то, что я на самом деле хочу сделать!

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

ssh gateway.my.company "
  hostname;
  hostname;
"

Это работает отлично. Вывод примерно такой:

target_machine
target_machine

Затем я сохранил набор команд в переменной и передал ее:

command="
  hostname;
  hostname;
"
ssh gateway.my.company $command

Вывод абсолютно одинаков — обе hostnameкоманды выполняются на целевом объекте.

Далее я добавляю дополнительный ssh-хоп (к частной машине):

ssh gateway.my.company ssh target_machine_ip $command

На этот раз две hostnameкоманды запускаются на разных машинах:

target_machine
gateway_machine

Похоже, я могу решить этот шаг, заключив cmd в экранированные кавычки (т.е. \"$command\"), но если я это сделаю, то мне придется обернуть его по-другому для прямого случая, поскольку ssh gateway.my.company \"$command\"больше не работает

ПРИМЕЧАНИЕ: Я понимаю, что команды следует хранить не в переменной, а в функции, но поскольку я использую ssh, любая объявленная мной функция не будет существовать, как только я подключусь по ssh к следующему серверу.

EDIT: В исходном вопросе пропущен второй скачок, извините!

решение1

Вам не хватает только некоторых цитат:

ssh gateway.my.company "$command"

Связанный контент