您的位置:首页 > 运维架构 > Shell

使用shell, ssh进行集群管理

2010-11-14 16:40 681 查看

在while和for循环中使用ssh

关键字: 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的重定向还真复杂。

--------------------------------------------------------------------------------------------------------

在我的集群上:
用ssh更新每台linux机器的用户名XX密码为YY,举例说明:
需要两个文件1 chgpasswd.shell 2. server_list.txt
1. chgpasswd.shell



2. server_list.txt
IP信息或者是主机名均可

在此过程中遇到的问题是windows 下面编辑的shell脚本可能是编码等的原因在Linux下执行出现错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息