Как передать переменную в цикле удаленно выполняемой команде? - PullRequest
1 голос
/ 27 марта 2019

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

ssh 192.168.0.10 'VMID="$(vim-cmd vmsvc/getallvms | grep HPDesktop2  | awk "{print $1}" )"; vim-cmd vmsvc/power.off $VMID'

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

while read ID; do

ssh 192.168.0.10 'VMID="$(vim-cmd vmsvc/getallvms | grep $ID  | awk "{print $1}" )"; vim-cmd vmsvc/power.off $VMID'

done <Hostnames

Кажется, что переменная не передается, потому что я получаю инструкцию по использованию grep и следующую ошибку:

Использование: power.offvmid

Выключите указанную виртуальную машину.

Недостаточно аргументов.

1 Ответ

0 голосов
/ 27 марта 2019

пример проблемы, с которой вы столкнулись:

ubuntu@ubuntu:~$ hello="hi"
ubuntu@ubuntu:~$ echo '$hello'
$hello
ubuntu@ubuntu:~$ 

команда, которую вы передаете в качестве аргумента ssh, заключена в одинарные кавычки, поэтому она не будет оценена на вашем локальном компьютере.Это проблема, поскольку переменная ID существует только в контексте вашего скрипта, работающего на локальном компьютере.Может быть, использовать кавычки и нас \", чтобы избежать кавычек внутри строки в кавычках?

...