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



我试图在一个循环中连接到多个主机,并通过ssh运行一些命令/脚本,并将结果存储在本地变量中。我使用的是here-doc,但我对是否应该引用它有点困惑,因为我使用的混合了本地变量和远程声明的变量。什么是正确的语法?我需要什么才能逃脱?

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部分(

非常感谢

简短回答:转义(带反斜杠(您希望在远程计算机上解释的每个$和反勾号。实际上,我建议用$( )替换backticks(然后转义$(。我还没有测试,但这应该可以做到:

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时,它告诉局部shell根本不要做任何解释,所以局部变量($WD(没有被替换。

您可以使用以下bash脚本:

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

最新更新