首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >运维脚本:测试网络连通性

运维脚本:测试网络连通性

原创
作者头像
迷途小书童
修改2024-11-27 14:10:03
修改2024-11-27 14:10:03
2421
举报
  • 脚本所需的测试文件示例

代码语言:txt
复制
# 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
  • 脚本运用于批量测试网络连通性
代码语言:txt
复制
#!/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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档