多线程执行shell
实验情况,需要查看哪些服务器可以ping通,哪些服务器可以登录,把网络不通的,和登录失败的都列出来。
#!/bin/bash
#查看是否安装sshpass服务
ssh_pass=rpm -qa|grep sshpass|wc -l
#如果结果等于0,代表没有安装,则进行安装sshpass服务
if [ $ssh_pass -eq 0 ]
then
rpm -ivh ./sshpass-1.06-2.el7.x86_64.rpm
fi
#对于未连接过的主机,对sshd进行优化
echo “StrictHostKeyChecking no” > /root/.ssh/config
#创建有名管道
[ -e /tmp/fd1 ] || mkfifo /tmp/fd1
#创建文件描述符,可以用可读(<)可写(>)的方式关联管道文件,这样文件描述符3就有了有名管道的所有特性
exec 3<>/tmp/fd1
#关联后的文件描述符拥有管道文件的所有特性,所以文件可以删除,我们留下文件描述符用就可以了
rm -f /tmp/fd1
for ((i=1;i<=10;i++))
do
#&3代表引用文件描述符3,这条命令代表往管道里面放入一个 令牌
echo >&3
done
#循环ip列表
for ip in cat ip.txt
do
#read -u3 代表从管道里提出一个令牌
read -u3
{
#查看服务器网络通信是否正常
ping -c2 $ip > ping.txt
#如果不正常则输出ip ping error到error.txt
tong=cat ping.txt|grep 'ttl'|wc -l
if [ t o n g − e q 0 ] t h e n e c h o " tong -eq 0 ] then echo "