bash запускает несколько команд на удаленных хостах через ssh - PullRequest
0 голосов
/ 04 декабря 2018

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

for host in $HOSTS; do
   RESULT+=$(ssh -T $host <<EOF   
   H=`dirname $HOME`
   M=`mount | grep $H | grep nfs`
   [[ "$M" ]] && MYFILE=$WD/file1 ||  MYFILE=$WD/file2
   cd $WD && monit.sh $MYFILE
EOF
   )
done

$ RESULT и $ WD - локальные переменные, а остальные - удаленные.Результатом вышеописанного является то, что локальные переменные имеют ожидаемые значения, в то время как все удаленно объявленные переменные пусты ($ H, $ M, $ MYFILE ..). Если я заключаю EOF в одинарные кавычки, результат как-то меняется на противоположный: $ WDпусто, в то время как $ H и $ M получают правильные значения ($ MYFILE также, но без части $ WD)

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 01 августа 2019

Вы можете использовать ниже bash скрипт:

for s in $(cat host.txt); do
   ssh root@${s} 'bash -s' < /tmp/commands.sh
done
0 голосов
/ 04 декабря 2018

Краткий ответ: экранирование (с обратной косой чертой) каждые $ и обратный удар, которые вы хотите интерпретировать на удаленном компьютере.На самом деле, я бы рекомендовал заменить галочки на $( ) (и затем экранировать $).Я не проверял, но это следует сделать:

for host in $HOSTS; do
   RESULT+=$(ssh -T $host <<EOF   
   H=\$(dirname \$HOME)
   M=\$(mount | grep \$H | grep nfs)
   [[ "\$M" ]] && MYFILE=$WD/file1 ||  MYFILE=$WD/file2
   cd $WD && monit.sh \$MYFILE
EOF
   )
done

Без экранирования все интерпретировалось локальной оболочкой, прежде чем оно было отправлено в удаленную систему.Когда вы цитировали EOF, это указывало локальной оболочке вообще не выполнять никакой интерпретации, поэтому локальная переменная ($WD) не заменялась.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...