首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

While循环吃hang行了?

《向往的生活》第五季开始了,之前被第一季的一首歌曲洗脑了:心火烧,原名《情伴》,作为新中国第一首流行歌曲,绝对是神曲的鼻祖呀,而在向往的生活中被宋丹丹老师、黄磊老师等演艺之后每天哼哼到无法自拔

进入正题

之前因为测试准备了一个脚本,流程就是类似要登录各个server然后执行命令,从设计来说感觉蛮简单的:

把各server的IP全部写入到一个文件,while循环读取每一行的IP通过ssh登录并执行命令之后继续下一个,设想的最初代码如下:

初始代码

#!/bin/bash -f

if [ -z $1 ];then

{

echo "ERROR: missing IP File.";echo;exit

}

elif [ ! -f $1 ];then

{

echo;echo "File \"$1\" is not existed!";echo;exit;

}

else

{

while read ip;do

{

regex="\s*\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-

5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\b\s*"

is_ip=`echo $ip | egrep $regex | wc -l`

if [ $is_ip -eq 0 ]

then

{

echo "The \"$ip\" is not a correct IP address!";continue

}

else

{

ssh coreuser@$ip "hostname"

}

fi

}

done

}

fi

调集几个Server(其实就一个Server,多进行几次罢了——机智如我^_^)来试一试,结果why not only once,i have three IPs呀(震惊了我的双眼):

Test

将循环体的ssh加入了-t的参数来制造一个伪终端来显示一下登录的执行过程,如下:

ssh -t -t coreuser@$ip "hostname"

运行脚本之后结果如下:

咦~好像读取了文件中的内容呀~但是为什么不是ssh各个IP呢?却类似将各个IP在远端Server中执行了呢?

然后经过反复百度google终于找到了一个帖子,解释如下:

因为重定向是针对整个while循环块的,而不只是read命令,read从输入读取了一行内容后,其它的程序(比如 rsh或sed)从同样的地方把其它的输入读走了,read当然读不到其它内容了,while也就结束了

解决方法

通过exec修改文件描述符来完美解决,添加如下代码块:

exec 3

whilereadip

do

....

done

最终方案

果然修改之后的代码运行结果完美切合自己所想:

修改后的代码

#!/bin/bash -f

if [ -z $1 ];then

{

echo "ERROR: missing IP File.";echo;exit

}

elif [ ! -f $1 ];then

{

echo;echo "File \"$1\" is not existed!";echo;exit;

}

else

{

exec 3

while read ip

{

regex="\s*\b(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(25[0-

5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\b\s*"

is_ip=`echo $ip | egrep $regex | wc -l`

if [ $is_ip -eq 0 ]

then

{

echo "The \"$ip\" is not a correct IP address!";continue

}

else

{

ssh coreuser@$ip "hostname"

}

fi

}

done

exec 3

}

fi

应用

那么问题来了?这个到底有什么用呢?这个对于运营维护随便写一个shell可以有很大的作用,比如我的这个ssh,就可以将所有的相同类型server作为一个组,然后循环对server进行检查等行文。在集群和现在云中的多VM中应该比较常见吧?(没做过不是很懂,当然对运维来说使用python等语言更加容易,但是python可能需要对应的module,没这个shell来的快和方便呀)。

哪些命令具有吃行的本领呢?

ssh、sed,额~

欢迎留言来总结这样有意思的命令~

参考资料:

http://blog.csdn.net/ace_fei/article/details/6653503

欢迎关注公众号:七禾页话(qiheyehk),旅行、摄影。。。

你点的每个『在看』,我都认真地当成了喜欢

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200521A03E6G00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券