ssh внутри скрипта с командой «command» вместо «command»

Я пытаюсь запускать команды на разных узлах нашего кластера автоматически с помощью простого сценария. Я видел, что могу бежать:

#!/bin/bash echo "Machine: "$HOSTNAME; ssh machine2 'echo Machine: $HOSTNAME;' echo "Machine: "$HOSTNAME; 

и я получаю ожидаемые результаты:

 Machine: machine1 Machine: machine2 Machine: machine1 

Тем не менее, я хотел бы запускать более сложные команды, которые потребуют переменные, поэтому мне нужно будет использовать " вместо ' для команд после ssh . Однако ssh не работает, если я делаю это следующим образом:

 #!/bin/bash echo "Machine: "$HOSTNAME; ssh machine2 "echo Machine: $HOSTNAME;" echo "Machine: "$HOSTNAME; 

возвращает:

 Machine: machine1 Machine: machine1 Machine: machine1 

Я видел другие вопросы, которые конкретно указывают на запуск команд таким образом, используя " , поэтому я не понимаю, что здесь происходит.

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

Один из вариантов – написать скрипт для действий, которые нужно обрабатывать удаленно, таким образом, инкапсулируя любую ссылку на локальные переменные, чтобы кавычки локального хоста не могли видеть их для их расширения.

Еще один вариант для очень короткого сегмента – это смешать ваши кавычки, например:

 FRUIT=apples ssh machine2 "echo Eating $FRUIT "'on $HOSTNAME' 

Переменные в сегменте с двойными кавычками будут оцениваться локально (до выполнения ssh ). Все в сегменте с одним кадром будет рассматриваться как литерал. Две цитируемые строки будут объединены для создания строкового echo Eating apples on $HOSTNAME и результат передается как литерал, который будет оцениваться удаленно.

Вы можете убедиться сами:

 [user@bluepc ~]$ echo "$HOSTNAME;" bluepc; [user@bluepc ~]$ echo '$HOSTNAME;' $HOSTNAME; 

Переменные среды в одинарных кавычках рассматриваются как строки.

В случае ssh, если вы используете двойные кавычки:

  • Строка заменяется на локальном сервере.
  • Команда выполняется удаленно.

если вы используете одинарные кавычки:

  • Строка передается как таковая на удаленный сервер.
  • Замещение происходит удаленно
  • Выполняется команда