SSHによるリモートforループ

SSHによるリモートforループ

私のスクリプトには次のものがあります

for server in ${servers[@]}; do
    echo ${server}
    ssh user@${server} "for i in /tmp/foo* ; do echo ${i}; done"
done

しかし、これはうまくいきません。奇妙なことに、$ I金額の返品ラインが表示されます。したがって、10個のファイルがある場合は、10個の空白行が表示されます。

答え1

ローカルシェルは${i}二重引用符()"内の内容を解釈するため、このコマンドの結果は次のとおりです。

ssh [email protected] "for i in /tmp/foo* ; do echo; done"

一重引用符(')のみを使用すると問題が消えます。

ssh user@${server} 'for i in /tmp/foo* ; do echo $i; done'

答え2

私はこの問題を発見しました。提供されたソリューションは機能しますが、sshの前に繰り返す配列を生成するローカルシェルから変数を抽出する場合は、あまり効率的ではありません。少し混乱しているのは、最初は$をエスケープすることです。

"for i in /tmp/foo* ; do echo \${i}; done"

これは、呼び出す ssh シェルではなくローカル構成でエスケープされます。

答え3

また、リストからポートを取得するために上記の回答を更新しました。

for i in {10.21.xxx.yyy,10.21.xxx.yyy,10.23.xxx.yyy};
do
        for j in {5501,5502,5503,5504,7701,7702,7703,7704,5551,5552,5553,7771,7772,7773};
        do
                (echo > /dev/tcp/${i}/${j}) > /dev/null 2>&1 && echo "${i}:${j} :: it's getting connected" || echo "${i}:${j} :: it's not connecting"
        done
done

関連情報