![](/img/trans.png)
[英]how to run docker commands in remote machine via jenkins and SSH?
[英]bash run multiple commands on remote hosts via ssh
我試圖在一個循環中連接到多個主機並通過 ssh 運行幾個命令/腳本,並將結果存儲在本地變量中。 我正在使用此處的文檔,但我對是否應該引用它感到有些困惑,因為我使用的是本地變量和遠程聲明變量的混合。 什么是正確的語法? 我需要逃避什么?
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 用單引號括起來,結果會以某種方式顛倒:為空,而 $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
,這告訴本地外殼根本不要做任何解釋,因此本地變量( $WD
)沒有被替換。
您可以使用以下 bash 腳本:
for s in $(cat host.txt); do
ssh root@${s} 'bash -s' < /tmp/commands.sh
done
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.