O problema é que o ssh lê a entrada padrão e, portanto, come todas as linhas restantes. Você pode simplesmente conectar sua entrada padrão a lugar nenhum:
$ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null
Eu tenho um loop for:
for host in $(cat ./hosts)
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done
e um loop while que é suposto para o mesmo trabalho que o loop acima:
while read host
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done <./hosts
hosts é um arquivo localizado no mesmo local que os scripts contendo e while loop e contém algum nome de host de servidores remotos.
O loop for imprime o resultado esperado (para todos os hosts listados no arquivo hosts), mas no caso do loop while, ele apenas imprime o uptime
do primeiro host e sai!
o arquivo hosts contém um nome de host por linha.
A questão é por que o comportamento desses dois loops é diferente?
O problema é que o ssh lê a entrada padrão e, portanto, come todas as linhas restantes. Você pode simplesmente conectar sua entrada padrão a lugar nenhum:
$ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null