# IP与端口使用 | 进行分割,多IP或多端口使用,分割
192.168.1.38,39,40|443,80,111,1111
192.168.1.10|80,443,80
192.168.1.11,192.68.1.21|80
#!/bin/bash
# checkConnectStatus.sh
# 批量测试网络连通性脚本
log_err() {
printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[31mERROR: \033[0m$@\n"
}
log_info() {
printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[32mINFO: \033[0m$@\n"
}
log_warning() {
printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[33mWARNING: \033[0m$@\n"
}
THREADS=5
# 等待队列初始化
queue_init() {
tmp="/tmp/$$.fifo"
mkfifo $tmp
exec 6<>$tmp
rm -f $tmp
for ((i = 1; i <= $THREADS; i++)); do
echo
done >&6
}
init() {
connectConfigDirPath="conf"
if [ ! -d "$connectConfigDirPath" ];then
mkdir $connectConfigDirPath
fi
connectFileName="${connectConfigDirPath}/connect.csv"
curlErrFileName="${connectConfigDirPath}/curlerr.txt"
ncErrFileName="${connectConfigDirPath}/ncerr.txt"
# 清空上一次内容
> $connectFileName
# 参数为空,打印使用方式
if [ $# -eq 0 ]; then
usage
fi
while [[ $# -gt 0 ]]; do
case $1 in
--fileName)
connectIpPortFileName=$2
shift
shift
;;
* | --help)
usage
;;
esac
done
}
usage() {
echo "Usage: $0
--fileName 填写测试连通性文件
"
exit 1
}
checkConnectToFile() {
local url=$1
resp=$(curl -s -w "#%{http_code}#%{time_total}" --max-time 3 "$url" | tr "\"" "'")
respHtml=$(echo $resp | egrep -i 'html|HTML' | wc -l | awk '{print $1}' )
if [ $respHtml -ne 0 ];then
resp=$(curl -s -w "返回前端资源页#%{http_code}#%{time_total}" -o /dev/null --max-time 5 "$url" | tr "\"" "'")
fi
status=$(echo $resp | awk -F"#" '{print $2}')
time_total=$(echo $resp | awk -F"#" '{print $3}')
data=$(echo -n $resp | awk -F"#" '{print $1}')
if [ $status -eq 000 ];then
curl --max-time 3 "$url" 2> $curlErrFileName
{
flock 000
data=$(cat $curlErrFileName)
} 000>"${curlErrFileName}.lock"
local ip=$(echo $url | awk -F":" '{print $1}')
local port=$(echo $url | awk -F":" '{print $2}')
# 使用nc进行TCP连接验证
{
# 文件执行过程加锁,等待直到可以锁定文件
flock 001
nc -zv $ip $port 2> $ncErrFileName
} 001>"${ncErrFileName}.lock"
# 若 nc返回0 bytes sent, 0 bytes received,则表示端口正常
# 若 nc返回其他,则表示端口异常
if [ 1 -eq $(grep 'Ncat: 0 bytes sent, 0 bytes received' $ncErrFileName | wc -l) ];then
message="网络连通性正常,tcp端口"
log_info "[connect] url: $url code: $status time: $time_total msg: $message"
else
message="请求失败,状态码异常"
log_err "[connect] url: $url code: $status time: $time_total data: [$data] msg: $message"
fi
elif [ $status -eq 200 ];then
message="网络连通性正常,状态码正常"
log_info "[connect] url: $url code: $status time: $time_total msg: $message"
else
message="网络连通性正常,状态码异常"
log_info "[connect] url: $url code: $status time: $time_total data: [$data] msg: $message"
fi
# 将测试结果记录到文件中,因使用多线程文件操作加锁
{
# 文件执行过程加锁,等待直到可以锁定文件
flock 002
# 结果记录到文件中
echo "$url|$status|$data|$message" >> $connectFileName
} 002>"${connectFileName}.lock" # 002是文件描述符,此处用于解锁
}
readFileToConnect() {
while read -r line;do
local IPList=$(echo $line | awk -F"|" '{print $1}')
local PortList=$(echo $line | awk -F"|" '{print $2}')
local conncetHostPortArray=()
# 配置数据处理
{
# 多IP情况下
if [ -n "$(echo $IPList | grep ',')" ];then
# 进行遍历
IFS=',' read -r -a ipArray <<< "$IPList"
for ip in ${ipArray[@]};do
local strLength=$(echo -n "$ip" | wc -c)
# 小于3则进行拼接
if [ $strLength -le 3 ];then
newIP=${startIP:0:-$strLength}$ip
else
startIP=$ip
# 最终IP地址
newIP=$ip
fi
if [ -n "$(echo $PortList | grep ',')" ];then
IFS=',' read -r -a portArray <<< "$PortList"
for port in ${portArray[@]};do
conncetHostPortArray+=("$newIP:$port")
done
else
conncetHostPortArray+=("$newIP:$PortList")
fi
done
#单IP
else
newIP=$IPList
if [ -n "$(echo $PortList | grep ',')" ];then
IFS=',' read -r -a portArray <<< "$PortList"
for port in ${portArray[@]};do
conncetHostPortArray+=("$newIP:$port")
done
else
conncetHostPortArray+=("$newIP:$PortList")
fi
fi
}
for hostPort in ${conncetHostPortArray[@]};do
read -u6
{
checkConnectToFile $hostPort
echo >&6
} &
done
wait
done < $connectIpPortFileName
log_info "最终验证文件: $connectFileName"
remove_file
exec 6>&-
exit 0
}
remove_file() {
rm -f ${connectFileName}.lock
rm -f $curlErrFileName
rm -f ${curlErrFileName}.lock
rm -f $ncErrFileName
rm -f ${ncErrFileName}.lock
}
main() {
init $@
queue_init
readFileToConnect
}
main $@
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。