for与while循环读行同时嵌套了ssh的区别问题

有个需求:一个文本第一列是ip,第二列是用户,需要登录到每台机器执行某个目录或者脚本

使用循环登录即可.如果while嵌套了ssh,就可能出问题

for和while读行的区别在于:

如果只有一列,结果都是一样的,但是多列的时候就不一样了

test.txt的内容如下

10.1.1.168 wind
10.1.1.171 wind
10.1.1.173 wind
10.1.1.176 wind
10.1.1.177 wind
10.1.1.178 wind
10.1.1.182 wind
10.1.1.185 wind
10.1.1.188 wind

使用for循环结果如下:

[root@10.1.1.172 /scripts]$ for line in `cat test.txt`;do echo $line;done
10.1.1.168
wind
10.1.1.171
wind
10.1.1.173
wind
10.1.1.176
wind
10.1.1.177
wind
10.1.1.178
wind
10.1.1.182
wind
10.1.1.185
wind
10.1.1.188
wind

使用while循环结果如下:

[root@10.1.1.172 /scripts]$ cat test.txt |while read line;do echo $line;done
10.1.1.168 wind
10.1.1.171 wind
10.1.1.173 wind
10.1.1.176 wind
10.1.1.177 wind
10.1.1.178 wind
10.1.1.182 wind
10.1.1.185 wind
10.1.1.188 wind

使用while来登陆:

#!/bin/bash

cat ip.txt|while read line
        do
        for ip in `echo $line|awk ‘{print $1}’`
        do
                ssh -i /home/maintain/wind/.ssh/id_rsa -o StrictHostKeyChecking=no wind@$ip “uptime && df -h”

        done
done

结果就是只做了一行就结束了…最后一行已经读取完了,循环也就结束了

while中使用重定向机制,也就是说一开始做while循环,test.txt的全部内容已经重定向给while循环,而ssh正好会读取输入中的所有东西.

只能采取将ssh的输入重定向输入.在ssh后面加上</dev/null

cat ip.txt|while read line
        do
                for ip in `echo $line|awk ‘{print $1}’`
                        do
                        ssh -i /home/maintain/wind/.ssh/id_rsa -o StrictHostKeyChecking=no wind@$ip “uptime && df -h” </dev/null
                        done
        done

此条目发表在Experience分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用*标注