gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:33:30 25 4
gpt4 key购买 nike

我正在尝试循环连接到多个主机并通过 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 部分)

非常感谢

最佳答案

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

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

关于linux - bash 通过 ssh 在远程主机上运行多个命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53609650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com