Intereting Posts
RHEL 6.7 kickstart с минимальным загрузочным носителем на UEFI Расширение имени файла: поиск соответствия шаблону утилиты и соответствие шаблону оболочки Bash Есть ли способ настроить форматирование даты / времени на экране входа в GNOME 3 и на рабочем столе? Есть ли способ фильтрации и печати определенного шаблона без повторения кода? Получение ошибки при попытке добавить репозиторий Ограничить результаты поиска в SSH Настроить systemd journald как для пересылки, так и для хранения в постоянном журнале? Преобразование окон в путь unix в командной строке приложения Wine * в конце пути к каталогу Как забыть / удалить настройки мобильного широкополосного подключения с монетного двора 14 Изменено ли поведение функции экспорта в bash? Как отключить драйвер Linux Mysql 100% 1 загрузка центрального процессора Для данного каталога, как проверить, какие файлы имеют определенный флаг разрешения в группе? GPG -edit-ключ терпит неудачу с «без секретного ключа», хотя -list-secret-keys и -sign работают как ожидалось

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, если вы используете двойные кавычки:

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

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

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