SSH経由のリモートforループ


11

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

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

しかし、それは機能しません。奇妙なことに、$ Iの改行が表示されます。したがって、10個のファイルがある場合、10行の空白行が表示されます。


GNU Parallelの --sshloginオプションも見てください。
セバスチャン

回答:


19

ローカルシェルは${i}二重引用符(")内を解釈するため、コマンドは次のように機能します。

ssh user@some.serv.er "for i in /tmp/foo* ; do echo; done"

'代わりに単一引用符()を使用するだけで、問題が解消されます。

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

1

sshを実行する前にローカルシェルから変数を取得している場合は、配列を作成して反復する場合、この問題は機能しますが、この問題は少し戻って実行されます。少し厄介なのは、最初に$をエスケープするだけなので、

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

呼び出されたsshシェルではなく、ローカルコンストラクト内でエスケープします。


0

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

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.