文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>for与while循环读行及嵌套ssh的区别

for与while循环读行及嵌套ssh的区别

时间:2010-05-24  来源:fengshihua

   有个需求:有三列信息文本,第一列IP,第二列用途,第三列备注,需要登录每个IP执行命令,不符合执行命令结果的,打印出文本中这一行信息。    需求很简单,只要用一个循环,能逐一登录到每台机器,执行命令就可以了,刚开始以为只要5分钟就能搞定的事情,结果花费了我一个上午的时间。主要耽搁在while循环里面嵌套了ssh。    首先说说for跟while读行的区别,如都只有一列,结果是一样的,但是如果多列,比如txt内容这样: line1 line2  line2 line4  line5  line6 用for循环: for line in `cat txt`; do echo $line; done 显示的结果: line1
line2
lien3
line4
line5 line6 用while循环: cat txt|while read line; do echo $line; done 显示的结果: line1 line2  line2 line4  line5  line6    因此我的需求能用while来做,脚本如下: cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh -o ConnectTimeout=10 ${IP} "ls -l /home/admin|grep \"keyword\""
    if [ ! $? == "0" ];then
        echo "$line"
     fi
done
   但是问题来了,执行后,只做了一行就结束了,刚开始还怀疑难道是if判断有问题,一个if结束就退出来了,于是在脚本的每一步都加了调试信息,结果很快发现并不是if结束就退出来了。于是就逐个注释掉调试,发现把ssh这句注释了就能继续下去,难道ssh哪里写错了?原因不是这样的。后来在网上查了资料,发现这么一句话:while中使用重定向机制。也就是说一开始做while循环,txt全部内容已经被重定向给while循环,而ssh语句正好会读取输入中的所有东西。于是自己调试一下:       cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh ${IP} "cat"
done
  显示结果: line4  line5  line6 也就是是说,最后一行已经读完了,循环也就结束了。 解决办法:将ssh的输入重定向输入。   cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh -o ConnectTimeout=10 ${IP} "ls -l /home/admin|grep \"keyword\"" </dev/null
    if [ ! $? == "0" ];then
        echo "$line"
     fi
done
ssh最后加上  </dev/null 问题解决。 转载请注明:http://fengshihua.cublog.cn
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载