• TC测试自动化Shell脚本


    在使用TC测试的发现手动进行丢包延迟抖动等场景的组合以及TC命令的切换效率很低,写了一个脚本可以提升效率,也可以根据自己的需求进行脚本更改!

    使用方法:
    1)运行sh脚本
    2)输入TC想要限制的网卡名和服务器IP地址即可

    使用效果:
    丢包率和延迟组合,缓存无限
    在这里插入图片描述
    延迟和抖动组合,缓存无限
    在这里插入图片描述
    丢包率与延迟组合

    #!/bin/sh
    
    #验证网络接口函数
    validate_interface() {
        # 网卡名称只能包含字母、数字和连字符
        pattern="^[a-zA-Z0-9-]+$"
        if [[ $1 =~ $pattern ]]; then
            return 0
        else
            return 1
        fi
    }
    
    #验证IP地址函数
    validate_ip_address() {
        # IP地址的格式为X.X.X.X,其中X为0-255之间的数字
        pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
        if [[ $1 =~ $pattern ]]; then
            return 0
        else
            return 1
        fi
    }
    
    # 提示用户输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):
    echo "请输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):"
    read input
    
    # 从输入中提取网络接口名称和服务器的IP地址
    interface_name=$(echo "$input" | awk '{print $1}')
    server_ip=$(echo "$input" | awk '{print $2}')
    
    # 验证网络接口名称
    if ! validate_interface "$interface_name"; then
        echo "网络接口名称不合法,请重新输入。"
        exit 1
    fi
    
    # 验证服务器IP地址
    if ! validate_ip_address "$server_ip"; then
        echo "服务器IP地址不合法,请重新输入。"
        exit 1
    fi
    
    #丢包率
    loss_percentages=("1" "5" "10" "15" "20")
    #延迟
    delay_parameters=("0" "50" "100" "200")
    
    #丢包率与延迟组合,limit缓存无限
    for loss_percentage in "${loss_percentages[@]}"; do
        for delay_parameter in "${delay_parameters[@]}"; do
            # 设置丢包率和延迟
            tc qdisc add dev "$interface_name" root netem loss "$loss_percentage%" delay "${delay_parameter}ms" limit 100000000 
            sleep 1
    
            # 执行iperf命令,并将结果保存到临时文件中
            iperf -c "$server_ip" -t 5 > iperf_output.txt
            sleep 5
    
            # 从临时文件中读取iperf结果
            iperf_result=$(cat iperf_output.txt)
    
            if [ -n "$iperf_result" ]; then
                # iperf_result不为空
                # 提取带宽值,正则表达式匹配整数或浮点数
                bandwidth=$(echo "$iperf_result" | grep -oE '([0-9]+(\.[0-9]+)?\s+\w+/sec)' | head -n 1)
            else
                # iperf_result为空
                echo "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - iperf_result为空" 
            fi
    
            # 保存带宽值到txt文件,文件存在就追加,不存在就创建
            if [ -e bandwidth_results.txt ]; then
                echo "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - 带宽:$bandwidth" >> bandwidth_results.txt
            else
                echo "丢包率 $loss_percentage% - 延迟 ${delay_parameter}ms - 带宽:$bandwidth" > bandwidth_results.txt
            fi
    
            #如果TC配置存在,删除TC的配置
            if tc qdisc show dev "$interface_name" | grep -q "netem"; then
                tc qdisc del dev "$interface_name" root
            fi
        done
    done
    
    echo "循环执行完毕,结果已保存到 bandwidth_results.txt 文件中!"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87

    延迟与抖动组合

    #!/bin/sh
    
    #验证网络接口函数
    validate_interface() {
        # 网卡名称只能包含字母、数字和连字符
        pattern="^[a-zA-Z0-9-]+$"
        if [[ $1 =~ $pattern ]]; then
            return 0
        else
            return 1
        fi
    }
    
    #验证IP地址函数
    validate_ip_address() {
        # IP地址的格式为X.X.X.X,其中X为0-255之间的数字
        pattern="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
        if [[ $1 =~ $pattern ]]; then
            return 0
        else
            return 1
        fi
    }
    
    # 提示用户输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):
    echo "请输入网络接口名称和服务器的IP地址 (例如: eth0 192.168.xx.xx):"
    read input
    
    # 从输入中提取网络接口名称和服务器的IP地址
    interface_name=$(echo "$input" | awk '{print $1}')
    server_ip=$(echo "$input" | awk '{print $2}')
    
    # 验证网络接口名称
    if ! validate_interface "$interface_name"; then
        echo "网络接口名称不合法,请重新输入。"
        exit 1
    fi
    
    # 验证服务器IP地址
    if ! validate_ip_address "$server_ip"; then
        echo "服务器IP地址不合法,请重新输入。"
        exit 1
    fi
    
    #延迟
    delay_parameters=("25" "50" "100")
    #抖动
    jitter_parameters=("25" "50" "100")
    
    #延迟和抖动组合,limit缓存无限
    for delay_parameter in "${delay_parameters[@]}"; do
        for jitter_parameter in "${jitter_parameters[@]}"; do
            # 设置延迟和抖动
            tc qdisc add dev "$interface_name" root netem delay "${delay_parameter}ms" "${jitter_parameter}ms" limit 100000000
            sleep 1
    
            # 执行iperf命令,并将结果保存到临时文件中
            iperf -c "$server_ip" -t 5 > iperf_output.txt
            sleep 5
              
            # 从临时文件中读取iperf结果
            iperf_result=$(cat iperf_output.txt)
    
            # iperf_result不为空
            if [ -n "$iperf_result" ]; then     
                # 提取带宽值,正则表达式匹配整数和浮点数均可
                bandwidth=$(echo "$iperf_result" | grep -oE '([0-9]+(\.[0-9]+)?\s+\w+/sec)' | head -n 1)
                # 若带宽为空
                if [ -z "$bandwidth" ]; then
                    echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - 带宽值为空"
                fi
            else
                # iperf_result为空
                echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms - iperf_result为空" 
            fi
    
            # 保存带宽值到txt文件,文件存在就追加,不存在就创建
            if [ -e bandwidth_results.txt ]; then
                echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms  - 带宽:$bandwidth" >> bandwidth_results.txt
            else
                echo "延迟 ${delay_parameter}ms - 抖动 ${jitter_parameter}ms  - 带宽:$bandwidth" > bandwidth_results.txt
            fi
    
            #如果TC配置存在,删除TC的配置
            if tc qdisc show dev "$interface_name" | grep -q "netem"; then
                tc qdisc del dev "$interface_name" root
            fi
        done
    done
    
    echo "循环执行完毕,结果已保存到 bandwidth_results.txt 文件中。"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
  • 相关阅读:
    Redis学习笔记——缓存更新策略
    【算法|动态规划No.20】leetcode416. 分割等和子集
    首站中科院!百度商业AI技术创新大赛开启巡回宣讲
    列表自动向上滚动
    第 4 章 串(串采用定长顺序存储结构实现)
    Python系列-Django
    PyTorch安装与配置教程(2022.11)
    关于将AAB转化为APK
    java计算机毕业设计小区物业管理系统演示录像2020源程序+mysql+系统+lw文档+远程调试
    HTML+CSS+JavaScript仿京东购物网站制作 html静态网页设计制作 dw静态网页成品模板素材网页 web前端网页设计与制作 div静态网页设计
  • 原文地址:https://blog.csdn.net/weixin_63787588/article/details/132845980