【Linux】While循环吃hang行了?(图是一个毒)

最近被一首歌曲洗脑了:心火烧,原名《情伴》,作为新中国的第一首流行歌曲,绝对是神曲的开山祖师呀,而在《向往的生活》中被宋丹丹老师、黄磊老师等演绎后,每天忍不住哼唱?

【Linux】While循环吃hang行了?(图是一个毒)进入正题

这两天因为测试准备了一个脚本,流程就是类似需要登录各个服务器然后执行命令,从设计上看感觉非常简单:

将各服务器的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″ does not exist!”;echo;exit;

}

else

{

while read ip;do

{

regex=”sb(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])bs

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

if [ $is_ip -eq 0 ]

then

{

echo “The “$ip” is not a valid IP address!”;continue

}

else

{

ssh coreuser@$ip “hostname”

}

fi

}

done < $1

}

fi

{感觉自己棒棒哒}

调集几个服务器(其实就一个服务器,多进行几次罢了——机智如我^_^)来试一试,结果为什么不只执行一次,我有三个IP呀(震惊了我的双眼):

【Linux】While循环吃hang行了?(图是一个毒)Test

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

ssh -t coreuser@$ip “hostname”

运行脚本之后结果如下:

【Linux】While循环吃hang行了?(图是一个毒)咦~好像读取了文件中的内容呀~但是为什么不是ssh各个IP呢?却类似将各个IP在远端服务器中执行了呢?

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

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

解决方法

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

exec 3<&0 <$1

while read ip <&3

do

….

done

exec 3>&-

最终方案

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

【Linux】While循环吃hang行了?(图是一个毒)修改后的代码

#!/bin/bash -f

if [ -z $1 ];then

{

echo “ERROR: missing IP File.”;echo;exit

}

elif [ ! -f $1 ];then

{

echo;echo “File “$1″ does not exist!”;echo;exit;

}

else

{

exec 3<&0 <$1

while read ip <&3

do

regex=”sb(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])bs

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

if [ $is_ip -eq 0 ]

then

{

echo “The “$ip” is not a valid IP address!”;continue

}

else

{

ssh coreuser@$ip “hostname”

}

fi

done

exec 3>&-

}

fi

应用

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

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

ssh、sed,额~

以上就是【Linux】While循环吃hang行了?(图是一个毒)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/25504.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月2日 12:40:07
下一篇 2025年11月2日 13:11:41

相关推荐

发表回复

登录后才能评论
关注微信