bash通过ssh在远程主机上运行多个命令

时间:2018-12-04 09:31:33

标签: linux bash ssh

我试图循环连接到多个主机,并通过ssh运行一些命令/脚本,并将结果存储在本地var中。我使用的是此处文档,但由于是否使用了本地var和远程声明的var,所以在是否应使用引号方面有些困惑。正确的语法是什么?我需要逃脱什么?

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 :(得分:2)

简短的回答:每var dic = new[] { TextBox1, TextBox2, TextBox3, TextBox4, TextBox5 } .Where(t => t.Text != "") .ToDictionary(t => t.Name, t => t.Text); 转义(反斜杠),然后在远程计算机上反引号。实际上,我建议将反引号替换为$(然后转义$( ))。我还没有测试过,但这应该可以做到:

$

在没有转义的情况下,所有内容都在被本地shell解释后才发送到远程系统。当您引用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 时,这告诉本地shell完全不要进行任何解释,因此本地变量(EOF)不会被替换。

答案 1 :(得分:-1)

您可以使用以下bash脚本:

for s in $(cat host.txt); do
   ssh root@${s} 'bash -s' < /tmp/commands.sh
done