`
you_laner
  • 浏览: 5933 次
  • 性别: Icon_minigender_2
  • 来自: 苏州
最近访客 更多访客>>
hqx
社区版块
存档分类
最新评论

在while和for循环中使用ssh

阅读更多
    我在while循环中使用ssh,但ssh完第一行后就退出了,使用了exec, & 等命令均不行,后来看到这篇文章的解释,才明白。
 
    转载来自:http://blog.csdn.net/shrekmu/archive/2008/06/05/2513177.aspx,以示提醒备份。

    转载如下:
    最近在写一个自动更新的shell,可是发现如果在使用while循环从一个文件中读取ip地址,然后访问就只能读取第一行纪录。代码如下:
while read LINE
do
    echo *******************************************$LINE
    ssh 192.168.10.233 ls
done < data
  但是如果使用for就没有这个问题,非常的奇怪,for的代码如下:
for LINE in `cat data`
do
    echo *******************************************$LINE
    ssh 192.168.10.233 ls
done
  难道for和while竟然有这么大的差别,不可能吧。经过一番试验以后发现,原来并不是while的for的差别,而是while中使用重定向机制,data文件中的信息都已经读入并重定向给了整个while语句。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,ssh语句正好回读取输入中的所有东西,下面这个shell能很好的说明这个问题:
while read LINE
do
    echo *******************************************$LINE
    ssh 192.168.10.233 cat
done < data
执行这个shell就会发现,ssh中的cat语句会打印出data文件中的其他纪录,这就导致调用玩ssh语句后,输入缓存中已经都被读完了,当read语句再读的时候当然也就读不到纪录,循环也就退出了。改进方法是,将ssh的输入重定向输入:
while read LINE
do
    echo *******************************************$LINE
    ssh 192.168.10.233 ls < /dev/null
done <  data
  这样,在while语句中也能顺利的执行ssh语句了。linux的重定向还真复杂。
分享到:
评论
1 楼 daywbdb 2012-10-15  
谢谢,正是这个问题困扰了我很久,一直没有查找到解决方法,现在终于知道了。
补充一点,如果有管道的话应该放到管道输出之前添加/dev/null
比如:ssh 192.168.10.233 stat /home/test.sh </dev/null|grep -i Modify

相关推荐

Global site tag (gtag.js) - Google Analytics