【问题标题】:bash run multiple commands on remote hosts via sshbash 通过 ssh 在远程主机上运行多个命令
【发布时间】:2019-08-01 13:50:48
【问题描述】:

我正在尝试循环连接到多个主机并通过 ssh 运行一些命令/脚本,并将结果存储在本地 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 部分)

非常感谢

【问题讨论】:

    标签: linux bash ssh


    【解决方案1】:

    简短回答:每个$ 转义(使用反斜杠),并在远程计算机上解释您想要解释的反引号。实际上,我建议用$( ) 替换反引号(然后转义$)。我还没有测试过,但应该这样做:

    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) 没有被替换。

    【讨论】:

      【解决方案2】:

      您可以使用以下 bash 脚本:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        • 2018-03-26
        相关资源
        最近更新 更多