Контекст: Я пытаюсь выполнить ряд команд на удаленной машине, к которой у меня нет прямого доступа. Сначала мне нужно подключиться по 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"