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

РЕДАКТИРОВАТЬ: оригинальный вопрос опущен второй прыжок, извините!

1 ответ1

0

Вы пропускаете только некоторые цитаты:

ssh gateway.my.company "$command"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .