linux - bash 通过 ssh 在远程主机上运行多个命令
问题描述
我正在尝试循环连接到多个主机并通过 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
) 没有被替换。
推荐阅读
- nginx - nginx反向代理删除上游的子路径
- mysql - Nodejs函数返回未定义,虽然回调参数有一个值
- android - 地方自动完成正在打开一个新的覆盖谷歌搜索
- react-native - 在 React Native 中,Flatlist 循环遍历嵌套数组
- c++ - 我应该更改使用 push_back 的代码以使用 std::move 吗?
- testing - Arquillian 和 Open Liberty 需要现有安装吗?
- ios - 应用程序在模拟器中运行,但在我的 iPhone 中关闭
- sql-server - Mac bookpro 上的 Azure Data Studio-服务器连接错误
- linux - 为什么 Shift+Ctrl+e 导致 e 下划线并开始表情符号输入(linux)?
- c# - 从另一个类编辑类属性