簡體   English   中英

bash 通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM