我有一个 for 循环:
for host in $(cat ./hosts)
do
echo -e "$host"
ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null
echo -e "\n"
done
和一个 while 循环,它的作用与上面的 for 循环完全相同:
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
问题是 ssh 从标准输入读取,因此它会吃掉所有剩余的行。您可以将其标准输入连接到任何地方:
$ ssh -o "StrictHostKeyChecking no" $host "uptime" 2>/dev/null < /dev/null