Контекст: я пытаюсь выполнить кучу команд на удаленной машине, к которым я не могу получить прямой доступ - сначала я должен подключиться к 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 hop (на частную машину):
ssh gateway.my.company ssh target_machine_ip $command
На этот раз две команды hostname
запускаются на разных машинах:
target_machine
gateway_machine
Похоже, я могу разрешить этот шаг, заключив cmd в экранированные кавычки (т. Е. \"$command\"
), но если я это сделаю, то для прямого случая мне придется обернуть его по-другому как ssh gateway.my.company \"$command\"
больше не работает
ПРИМЕЧАНИЕ: я ценю, что команды должны храниться не в переменной, а в функции, но, поскольку я использую ssh, любая объявленная мной функция не будет существовать, как только я перейду на следующий сервер.
РЕДАКТИРОВАТЬ: оригинальный вопрос опущен второй прыжок, извините!