while进行批量ssh操作的问题

现在有这样一个场景,本机到一批机器的ssh key都已经打通,想用while循环到这批机器上执行命令,看下面的shell代码

#!/bin/sh

while read ip
do
    echo "ssh connecting to $ip"
    ssh $ip 'ls'
done < data

执行后会发现,只有一台机器成功ssh,并且执行了命令。很奇怪,再来看一段代码

#!/bin/sh

while read ip
do
    echo "ssh connecting to $ip"
    read
done < data

data文件里面有10个ip,但是实际echo却只有5个echo

ssh connecting to 192.168.1.1
ssh connecting to 192.168.1.2
ssh connecting to 192.168.1.3
ssh connecting to 192.168.1.4
ssh connecting to 192.168.1.5

如何解释以上的现象呢?问题还是while的重定向,在while进行重定向的时候,实际是一次把所有的内容都读取了,然后每次调用read的时候读取到换行或者EOF就结束。第二个例子在while循环里的read会从buffer里读取去,然后程序就没有block住,直接往下走了。

再来解释第一个代码,ssh的时候存在一个“尝试从终端读入的操作”,所以会把buffer后面的内容(第一个ip以外的剩余内容)都读入,这就导致只有一个ssh执行。

标签:none