while で sshコマンドを実行すると1回しか実行されない

タイトルどおりなのですがすごく悩んだあげく
ググってみたらすぐ解決策が見つかったのでメモしておく。

たとえば下記のようにファイルを読み込んで毎回毎回ssh ログインしてコマンドを実行するとどうなるか?

while read LINE
do
  ssh user@host hostname
done < ${FILE}

これ実は1回しか実行されないんです!

注意しましょう。なので下記のように -n をつけましょう。

while read LINE
do
  ssh -n user@host hostname
done < ${FILE}

chat-rate.com

www.m-bsys.com
2番目のブログから引用しますが

原因はsshコマンド実行に伴う標準入力の切替です。sshコマンドを実行すると、ローカルホストからの標準入力を停止し、sshで指定したリモートホストからの標準入力の受付を開始します。

つまり、上記のコードの例では、ローカルホストのファイルの読込みを終了させた上でsshコマンドを実行し、再びreadコマンドを実行しようとしているわけです。この時、既にファイルが閉じている為にwhileが終了してしまうわけです。

なるほど!