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 文件中!"

延迟与抖动组合

#!/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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值