TC测试自动化Shell脚本

news2024/12/23 8:39:04

在使用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 文件中。"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1006391.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【板栗糖GIS】——如何在两个电脑间同步简悦插件高级账户

【板栗糖GIS】——如何在两个电脑间同步简悦插件高级账户 目录 1. 找到账户UID 2. 复制UID 3. 在另一台装简悦插件的电脑修改成同样的UID 简悦是一款很好用的资料收集以及阅读插件,具体介绍可以在官网进行查看 简悦 SimpRead - 如杂志般沉浸式阅读体验的扩展 今天我只是想…

JAVAEE初阶相关内容第九弹--多线程(初阶)

目录 定时器 定时器是什么 标准库中的定时器 实现定时器 以上的代码存在两个问题 (1)MyTask没有指定优先级 (2)阻塞队列不满足还得塞回去 以上代码还存在一个问题: 完整代码实现 定时器 定时器是什么 类似于定闹钟一样。…

六、全局约束中的Alldifferen和Cumulative的实现

文章目录 1、Alldifferent的内部实现1.1 防御怪物问题1.2 Alldifferent 值域传播器 2、Cumulative的内部实现THE END 1、Alldifferent的内部实现 1.1 防御怪物问题 \qquad 假设有 N N N个村庄和 K K K支军队,且满足 K ≥ N K \geq N K≥N,每支军队都与某…

android studio platform使用体验分享(as无法跳转c/c++等native源码的福音,强烈推荐)

hi,粉丝朋友们: 大家好!这些天粉丝朋友们分享了一下Android Studio for Platform 这个最新的google开发的阅读aosp源码的工具,特别适合做原生系统开发。具体官方介绍如下地址: 参考链接:https://developer.…

《动手学深度学习 Pytorch版》 4.6 暂退法

import torch from torch import nn from d2l import torch as d2l4.6.1 重新审视过拟合 整节理论,详见书本。 4.6.2 扰动的稳健性 整节理论,详见书本。 4.6.3 实践中的暂退法 整节理论,详见书本。 4.6.4 从零开始实现 def dropout_la…

《C和指针》笔记24: 指针和间接访问

本文主要讲指针和间接访问,标题对应《C和指针对应的章节》,引用的地方是自己写的一些注释、理解和总结。 指针、间接访问和左值 先回顾一下左值和右值 左值代表着一个位置。右值代表着一个值。赋值等号左边是个左值,赋值等号右边是一个右值…

fabirc 将图像绘制原点定为图形内部

添加元素时,设置属性: originX: center, originY: center, 如我定义两个矩形: addrect () { // 矩形1var rect new fabric.Rect({top: 50,left: 100,width: 100,height: 70,fill: #F56C6C,strokeUniform: true // 限制边框宽度缩放})canva…

vue2实现自定义主题webpack-theme-color-replacer

需求:根据element的自定义主题色,之后改变element的全局所有颜色,解决页面刷新后主题色失效问题,这个需要把颜色存入到浏览器的存储中,如果换个浏览器就得重新选择了哈,如果需要在不同的浏览器保持一致的主…

langchain主要模块(四):Memory

langchain2之Memory langchain1.概念2.主要模块模型输入/输出 (Model I/O)数据连接 (Data connection)链式组装 (Chains)代理 (Agents)内存 (Memory)回调 (Callbacks) 3.MemoryConversationBufferMemoryConversationBufferWindowMemoryConversationTokenBufferMemoryConversati…

Error: svn: E155004: Run ‘svn cleanup‘ to remove locks

解决办法如下:点击settings 点击清除缓存按钮,然后再使用svn进行提交更新操作,但是可能还会有其它的错误,比如svn: E230001: Server SSL certificate verification failed,解决这个错误请参考我另一篇文章:…

【LeetCode: 2596. 检查骑士巡视方案:深度优先搜索】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

力扣 -- 300. 最长递增子序列

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int lengthOfLIS(vector<int>& nums) {int nnums.size();vector<int> dp(n,1);int ret1;for(int i0;i<n;i){for(int j0;j<i;j){if(nums[j]<nums[i]){dp[i]max(dp[i],dp[j]1);}}r…

分布式系统第五讲:分布式事务及实现方案

分布式系统第五讲&#xff1a;分布式事务及实现方案 事务是一个程序执行单元&#xff0c;里面的所有操作要么全部执行成功&#xff0c;要么全部执行失败。而分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。本…

微服务07-认识MQ+RabbitMQ入门

1.前言 了解同步调用和异步调用 1.1.同步调用 比如这里的支付服务&#xff0c;需要等待订单服务、短信服务…执行完毕才能执行&#xff0c;这样支付整个流程完毕需要500ms 然后如果订单、仓储等其中一个服务挂掉了&#xff0c;那么支付服务请求请求不了&#xff0c;挂掉的服…

Python实现进制转换

1 问题 如何将一个数从十进制转换成二进制&#xff0c;这个数从键盘输入。 2 方法 &#xff08;1&#xff09;输入一个十进制的数; &#xff08;2&#xff09;将这个数除以2求商和余数 &#xff08;3&#xff09;再用2去除商&#xff0c;又会得到一个商和余数&#xff0c;如此进…

企业用设备管理系统有什么好处?的修大数据管理平台的功能强大吗?

在现代工业运营中&#xff0c;设备的高效管理与维护对于维持生产稳定及提升企业竞争力具有重大意义。而设备管理系统作为一项重要工具&#xff0c;可以极大地提高企业的生产效率与设备维护的准确性。 企业使用设备管理系统的原因如下&#xff1a;   提高设备利用率&#xff1…

小白自助发卡销售系统|支持自助选号批量购买Thinkphp6.0+Layui

小白自助发卡销售系统 本系统由小白独立开发thinkphp+layui 功能特色: 1.前台下单支持自助选号。 2.前台库存显示方案增加3种。 3.自定义商品图片。 4.支持邮件通知功能具体可到后台自行体验。 5.支持批量下单购买。 6.支持易支付接口(目前用的比较多) 7.支持批量导入卡密 8.P…

从0到1理解ChatGPT原理

目录 写在前面 1.Tansformer架构模型 2.ChatGPT原理 3.提示学习与大模型能力的涌现 3.1提示学习 3.2上下文学习 3.3思维链 4.行业参考建议 4.1拥抱变化 4.2定位清晰 4.3合规可控 4.4经验沉淀 机械工业出版社京东自购链接 写在前面 2022年11月30日&#xff0c;ChatG…

【数据结构】二叉树链式结构的实现(三)

目录 一&#xff0c;二叉树的链式结构 二&#xff0c;二叉链的接口实现 1&#xff0c;二叉链的创建 2&#xff0c;接口函数 3&#xff0c;动态创立新结点 4&#xff0c;创建二叉树 5&#xff0c;前序遍历 6&#xff0c;中序遍历 7&#xff0c;后序遍历 三&#xff0c;结点个…

嵌入式学习笔记(25)串口通信的基本原理

三根通信线&#xff1a;Tx Rx GND &#xff08;1&#xff09;任何通信都要有信息作为传输载体&#xff0c;或者有线的或则无线的。 &#xff08;2&#xff09;串口通信时有线通信&#xff0c;是通过串口线来通信的。 &#xff08;3&#xff09;串口通信最少需要2根&#xff…