批量Ping执行Bash脚本

#!/bin/bash
# Ping Batch Script

# 连接超时时间
TMOUT=3
# 最大线程数
MAX_THREAD=4000
# 保留内存大小
MIN_MEM=400


# 默认ip配置,可通过 -r ip-ip指定,格式: ping_batch.sh -r 192.168.1.1-192.168.2.254
# ip前缀
ip_preffix="192.168"
# 16位主机范围 192.168.1-192.168.2
ip_network_range="1-2"
# ping范围 192.168.1.1-192.168.2.254
ip_host_range="1-254"

# ping脚本
PING_SCRIPT='ping -c 1 ${ip_preffix}.${ip_network}.${ip_host} &> /dev/null;[[ $? -eq 0 ]] && echo -e "\033[32m${ip_preffix}.${ip_network}.${ip_host} yes\033[0m" || echo -e "\033[32m${ip_preffix}.${ip_network}.${ip_host} no\033[0m" &>/dev/null'

# Ip格式错误提示
function ip_format_error()
{
echo -e "\033[31mIp format is incorrect.\nIp format: ping_batch.sh -r ip-ip.\nsimple: ping_batch.sh -r 192.168.1.1-192.168.2.1\033[0m"
}

# 传入参数Ip格式判断及格式化
case "$1" in
'-r')
shift
ip_start=`echo $1|awk -F'-' '{print $1}'`
ip_end=`echo $1|awk -F'-' '{print $2}'`
echo $ip_start|grep -E "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" &>/dev/null
[[ $? -eq 0 ]] || ip_format_error
echo $ip_end|grep -E "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" &>/dev/null
[[ $? -eq 0 ]] || ip_format_error
ip_start_preffix=`echo $ip_start|awk -F'.' '{print $1"."$2}'`
ip_end_preffix=`echo $ip_end|awk -F'.' '{print $1"."$2}'`
if [[ "$ip_start_preffix" == "$ip_end_preffix" ]]
then
ip_preffix=$ip_start_preffix
else
echo -e "\033[31m Ip 192.168.1.1-192.168.2.1\n192.168==192.168\nSubnet is 16 bits.\033[0m"
fi
ip_network_range_start=`echo $ip_start|awk -F'.' '{print $3}'`
ip_network_range_end=`echo $ip_end|awk -F'.' '{print $3}'`
ip_host_range_start=`echo $ip_start|awk -F'.' '{print $4}'`
ip_host_range_end=`echo $ip_end|awk -F'.' '{print $4}'`
ip_network_range="${ip_network_range_start}-${ip_network_range_end}"
ip_host_range="${ip_host_range_start}-${ip_host_range_end}"
;;
*)
echo -e "\033[31m参数错误,格式: ping_batch.sh -r 192.168.1.1-192.168.2.254\033[0m"
;;
esac

# 线程超过配置值,等待
function thread_wait()
{
sleep 1
if [[ $(ps -ef|wc -l) -gt $MAX_THREAD ]]
then
thread_wait
fi
}

# 内存保留检查,小于设定值则等待
function free_check()
{
sleep 2;
if [[ $(free -m|grep 'Mem:'|awk '{print $4}') -lt MIN_MEM ]]
then
free_check
fi
}

# 格式化Ip并执行ping脚本
for ip_network in `seq $(echo $ip_network_range|awk -F '-' '{print $1}') $(echo $ip_network_range|awk -F '-' '{print $2}')`
do
[[ $(ps -ef|wc -l) -gt $MAX_THREAD ]] && thread_wait
for ip_host in `seq $(echo $ip_host_range|awk -F '-' '{print $1}') $(echo $ip_host_range|awk -F '-' '{print $2}')`
do
[[ $(free -m|grep 'Mem:'|awk '{print $4}') -lt MIN_MEM ]] && free_check
(eval "${PING_SCRIPT}") &
done
done

猜你喜欢

转载自www.cnblogs.com/tianyuanchen/p/11371751.html
今日推荐