Почему результат этого цикла for и while отличается?

У меня есть цикл for:

for host in $(cat ./hosts) do echo -e "$host" ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null echo -e "\n" done 

и цикл 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 печатает ожидаемый результат (для всех узлов, перечисленных в файле hosts), но в случае цикла while он отображает только время uptime первого узла и завершает работу!

hosts содержит одно имя узла в строке.

Вопрос в том, почему поведение этих двух циклов различно?

Проблема в том, что ssh читает со стандартного ввода, поэтому он ест все оставшиеся строки. Вы можете просто подключить его стандартный вход в никуда:

 $ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null 

Рекомендации

  • ssh вырывается из цикла while в bash