forループがあります。
for host in $(cat ./hosts)
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done
上記のforループとまったく同じことを行うwhileループです。
while read host
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done <./hosts
Hostsはforループとwhileループを含むスクリプトと同じ場所にあるファイルで、リモートサーバーの一部のホスト名を含みます。 forループは(ホストファイルにリストされているすべてのホストに対して)期待される結果を出力しますが、whileループの場合は最初のホストのみを印刷して終了uptime
します。
ホストファイルには、1行に1つのホスト名が含まれます。
問題は、なぜこれら2つのループが異なる動作をするのかです。
答え1
問題は、sshが標準入力から読み取られるので、残りの行をすべて食べるということです。標準入力はどこからでも接続できます。
$ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null