极客专属打造全自动网络测速监控系统Shell脚本实战家里网络突然变慢服务器带宽不稳定别再手动测速了今天教你用Shell脚本打造一个全自动的网络测速监控系统让你的OpenWrt路由器或Linux服务器变身智能网络管家。这个方案不仅能定时测速还能自动记录数据、触发告警甚至把结果推送到你的手机——全部零成本完全DIY可控。1. 为什么需要自动化测速网络质量监控是运维工作的基础环节。传统手动测速方式存在几个明显缺陷时效性差无法实时掌握网络波动情况数据零散结果难以形成历史记录对比操作繁琐每次都需要人工介入执行我们的解决方案将实现# 典型运行效果示例 [2023-08-20 14:00:01] 下载: 85.6 Mbps | 上传: 32.4 Mbps [2023-08-20 15:00:01] 下载: 78.2 Mbps | 上传: 30.1 Mbps [2023-08-20 16:00:01] 警告下载速度低于阈值: 12.4 Mbps提示本方案特别适合以下场景家庭宽带质量长期监控服务器带宽稳定性检查多线路负载均衡效果评估2. 核心测速脚本开发2.1 基础测速功能实现我们使用cURL这个强大的网络工具作为测速核心相比传统speedtest-cli这种方式更轻量、更可控#!/bin/bash # 定义结果存储路径 RESULT_FILE/var/log/speedtest.log TEMP_DIR/tmp/speedtest # 创建临时目录 mkdir -p $TEMP_DIR # 选择最优测速节点 select_best_node() { # 从可靠源获取节点列表 NODE_LIST$(curl -s https://example.com/nodes.json) # 测试每个节点的延迟 for node in $NODE_LIST; do latency$(ping -c 3 $node | awk -F / END {print $5}) echo $latency $node $TEMP_DIR/nodes.latency done # 选择延迟最低的节点 BEST_NODE$(sort -n $TEMP_DIR/nodes.latency | head -1 | awk {print $2}) echo $BEST_NODE }关键参数说明参数说明推荐值--connect-timeout连接超时2-5秒-m最大测速时间30-60秒-o输出目标/dev/null-L跟随重定向必须启用2.2 下载速度测试实现test_download() { local node$1 local size100000000 # 100MB测试文件 # 执行下载测试 speed$(curl -L -o /dev/null \ --connect-timeout 5 \ -m 30 \ -w %{speed_download} \ http://$node/download?size$size 2/dev/null) # 转换单位为Mbps echo $speed | awk {printf %.2f, $1/125000} }2.3 上传速度测试实现test_upload() { local node$1 local file$TEMP_DIR/test.dat # 生成测试文件 dd if/dev/zero of$file bs1M count50 2/dev/null # 执行上传测试 speed$(curl -X POST \ -F file$file \ --connect-timeout 5 \ -m 30 \ -w %{speed_upload} \ http://$node/upload 2/dev/null) # 清理并返回结果 rm -f $file echo $speed | awk {printf %.2f, $1/125000} }3. 系统集成与自动化3.1 结果记录与格式化log_result() { local download$1 local upload$2 # 添加时间戳 timestamp$(date %Y-%m-%d %H:%M:%S) # 格式化输出 echo [$timestamp] 下载: $download Mbps | 上传: $upload Mbps $RESULT_FILE # 控制台输出 echo 测速完成: 下载 $download Mbps / 上传 $upload Mbps }3.2 异常检测与告警check_threshold() { local download$1 local upload$2 # 定义阈值 (可配置) local DL_THRESHOLD10 # Mbps local UL_THRESHOLD5 # Mbps if (( $(echo $download $DL_THRESHOLD | bc -l) )); then send_alert 下载速度低于阈值: $download Mbps fi if (( $(echo $upload $UL_THRESHOLD | bc -l) )); then send_alert 上传速度低于阈值: $upload Mbps fi }3.3 通知集成示例Telegramsend_alert() { local message$1 local bot_tokenYOUR_BOT_TOKEN local chat_idYOUR_CHAT_ID curl -s -X POST \ -d chat_id$chat_id \ -d text$message \ https://api.telegram.org/bot$bot_token/sendMessage /dev/null }4. 部署与定时执行4.1 安装依赖在OpenWrt上opkg update opkg install curl coreutils-dd bash在Linux服务器上# Debian/Ubuntu apt update apt install -y curl coreutils # RHEL/CentOS yum install -y curl coreutils4.2 设置cron定时任务# 编辑crontab crontab -e # 添加以下内容每小时测试一次 0 * * * * /path/to/your/speedtest.sh定时任务配置建议频率适用场景注意事项每小时一般监控平衡资源消耗与时效性每15分钟关键业务可能增加网络负担每天长期趋势分析细节可能不足4.3 日志轮转配置为防止日志文件过大创建logrotate配置cat /etc/logrotate.d/speedtest EOF /var/log/speedtest.log { daily rotate 7 compress missingok notifempty } EOF5. 进阶优化技巧5.1 多节点轮询测试# 在select_best_node函数中添加节点健康检查 check_node_health() { local node$1 local http_code$(curl -s -o /dev/null -w %{http_code} \ --connect-timeout 2 \ http://$node/health) [ $http_code -eq 200 ] }5.2 结果可视化可选安装GNUplot生成趋势图# 安装gnuplot apt install -y gnuplot # 生成绘图脚本 cat plot_speed.gp EOF set terminal png size 800,400 set output speed.png set xdata time set timefmt %Y-%m-%d %H:%M:%S set format x %m/%d\n%H:%M set grid set title 网络带宽趋势 set ylabel 速度 (Mbps) plot speedtest.log using 1:4 with lines title 下载, \ using 1:8 with lines title 上传 EOF5.3 微信/邮件通知集成使用mailx发送邮件通知# 安装mailx apt install -y bsd-mailx # 配置sendmail send_email_alert() { local subject网络异常告警 local body$1 echo $body | mail -s $subject adminexample.com }6. 故障排查指南当脚本运行异常时可以按以下步骤排查检查基础连接ping -c 4 8.8.8.8 curl -v https://example.com验证cURL版本curl --version | head -1确保版本≥7.15.0支持speed_download参数手动测试节点# 替换为你的测速节点 curl -o /dev/null http://speedtest.node/download?size1000000检查临时文件权限ls -ld /tmp/speedtest查看完整日志tail -f /var/log/speedtest.log7. 安全加固建议最小权限原则chmod 750 /path/to/speedtest.sh chown root:root /path/to/speedtest.sh敏感信息保护# 将Telegram token等存储在单独配置文件 source /etc/speedtest.confHTTPS验证curl --cacert /path/to/ca.pem https://secure-node/speedtest输入验证if [[ ! $node ~ ^[a-zA-Z0-9.-]$ ]]; then echo 无效节点地址 exit 1 fi这个脚本在我的家庭网络和几台云服务器上稳定运行了两年多期间帮助我发现并解决了三次ISP线路问题。最实用的改进是添加了Telegram通知功能——当我在外收到带宽异常提醒时可以立即让家人检查是否有人在下载大文件或者直接联系ISP报修。
保姆级教程:给你的OpenWrt路由器或Linux服务器写个自动测速脚本(Shell版)
极客专属打造全自动网络测速监控系统Shell脚本实战家里网络突然变慢服务器带宽不稳定别再手动测速了今天教你用Shell脚本打造一个全自动的网络测速监控系统让你的OpenWrt路由器或Linux服务器变身智能网络管家。这个方案不仅能定时测速还能自动记录数据、触发告警甚至把结果推送到你的手机——全部零成本完全DIY可控。1. 为什么需要自动化测速网络质量监控是运维工作的基础环节。传统手动测速方式存在几个明显缺陷时效性差无法实时掌握网络波动情况数据零散结果难以形成历史记录对比操作繁琐每次都需要人工介入执行我们的解决方案将实现# 典型运行效果示例 [2023-08-20 14:00:01] 下载: 85.6 Mbps | 上传: 32.4 Mbps [2023-08-20 15:00:01] 下载: 78.2 Mbps | 上传: 30.1 Mbps [2023-08-20 16:00:01] 警告下载速度低于阈值: 12.4 Mbps提示本方案特别适合以下场景家庭宽带质量长期监控服务器带宽稳定性检查多线路负载均衡效果评估2. 核心测速脚本开发2.1 基础测速功能实现我们使用cURL这个强大的网络工具作为测速核心相比传统speedtest-cli这种方式更轻量、更可控#!/bin/bash # 定义结果存储路径 RESULT_FILE/var/log/speedtest.log TEMP_DIR/tmp/speedtest # 创建临时目录 mkdir -p $TEMP_DIR # 选择最优测速节点 select_best_node() { # 从可靠源获取节点列表 NODE_LIST$(curl -s https://example.com/nodes.json) # 测试每个节点的延迟 for node in $NODE_LIST; do latency$(ping -c 3 $node | awk -F / END {print $5}) echo $latency $node $TEMP_DIR/nodes.latency done # 选择延迟最低的节点 BEST_NODE$(sort -n $TEMP_DIR/nodes.latency | head -1 | awk {print $2}) echo $BEST_NODE }关键参数说明参数说明推荐值--connect-timeout连接超时2-5秒-m最大测速时间30-60秒-o输出目标/dev/null-L跟随重定向必须启用2.2 下载速度测试实现test_download() { local node$1 local size100000000 # 100MB测试文件 # 执行下载测试 speed$(curl -L -o /dev/null \ --connect-timeout 5 \ -m 30 \ -w %{speed_download} \ http://$node/download?size$size 2/dev/null) # 转换单位为Mbps echo $speed | awk {printf %.2f, $1/125000} }2.3 上传速度测试实现test_upload() { local node$1 local file$TEMP_DIR/test.dat # 生成测试文件 dd if/dev/zero of$file bs1M count50 2/dev/null # 执行上传测试 speed$(curl -X POST \ -F file$file \ --connect-timeout 5 \ -m 30 \ -w %{speed_upload} \ http://$node/upload 2/dev/null) # 清理并返回结果 rm -f $file echo $speed | awk {printf %.2f, $1/125000} }3. 系统集成与自动化3.1 结果记录与格式化log_result() { local download$1 local upload$2 # 添加时间戳 timestamp$(date %Y-%m-%d %H:%M:%S) # 格式化输出 echo [$timestamp] 下载: $download Mbps | 上传: $upload Mbps $RESULT_FILE # 控制台输出 echo 测速完成: 下载 $download Mbps / 上传 $upload Mbps }3.2 异常检测与告警check_threshold() { local download$1 local upload$2 # 定义阈值 (可配置) local DL_THRESHOLD10 # Mbps local UL_THRESHOLD5 # Mbps if (( $(echo $download $DL_THRESHOLD | bc -l) )); then send_alert 下载速度低于阈值: $download Mbps fi if (( $(echo $upload $UL_THRESHOLD | bc -l) )); then send_alert 上传速度低于阈值: $upload Mbps fi }3.3 通知集成示例Telegramsend_alert() { local message$1 local bot_tokenYOUR_BOT_TOKEN local chat_idYOUR_CHAT_ID curl -s -X POST \ -d chat_id$chat_id \ -d text$message \ https://api.telegram.org/bot$bot_token/sendMessage /dev/null }4. 部署与定时执行4.1 安装依赖在OpenWrt上opkg update opkg install curl coreutils-dd bash在Linux服务器上# Debian/Ubuntu apt update apt install -y curl coreutils # RHEL/CentOS yum install -y curl coreutils4.2 设置cron定时任务# 编辑crontab crontab -e # 添加以下内容每小时测试一次 0 * * * * /path/to/your/speedtest.sh定时任务配置建议频率适用场景注意事项每小时一般监控平衡资源消耗与时效性每15分钟关键业务可能增加网络负担每天长期趋势分析细节可能不足4.3 日志轮转配置为防止日志文件过大创建logrotate配置cat /etc/logrotate.d/speedtest EOF /var/log/speedtest.log { daily rotate 7 compress missingok notifempty } EOF5. 进阶优化技巧5.1 多节点轮询测试# 在select_best_node函数中添加节点健康检查 check_node_health() { local node$1 local http_code$(curl -s -o /dev/null -w %{http_code} \ --connect-timeout 2 \ http://$node/health) [ $http_code -eq 200 ] }5.2 结果可视化可选安装GNUplot生成趋势图# 安装gnuplot apt install -y gnuplot # 生成绘图脚本 cat plot_speed.gp EOF set terminal png size 800,400 set output speed.png set xdata time set timefmt %Y-%m-%d %H:%M:%S set format x %m/%d\n%H:%M set grid set title 网络带宽趋势 set ylabel 速度 (Mbps) plot speedtest.log using 1:4 with lines title 下载, \ using 1:8 with lines title 上传 EOF5.3 微信/邮件通知集成使用mailx发送邮件通知# 安装mailx apt install -y bsd-mailx # 配置sendmail send_email_alert() { local subject网络异常告警 local body$1 echo $body | mail -s $subject adminexample.com }6. 故障排查指南当脚本运行异常时可以按以下步骤排查检查基础连接ping -c 4 8.8.8.8 curl -v https://example.com验证cURL版本curl --version | head -1确保版本≥7.15.0支持speed_download参数手动测试节点# 替换为你的测速节点 curl -o /dev/null http://speedtest.node/download?size1000000检查临时文件权限ls -ld /tmp/speedtest查看完整日志tail -f /var/log/speedtest.log7. 安全加固建议最小权限原则chmod 750 /path/to/speedtest.sh chown root:root /path/to/speedtest.sh敏感信息保护# 将Telegram token等存储在单独配置文件 source /etc/speedtest.confHTTPS验证curl --cacert /path/to/ca.pem https://secure-node/speedtest输入验证if [[ ! $node ~ ^[a-zA-Z0-9.-]$ ]]; then echo 无效节点地址 exit 1 fi这个脚本在我的家庭网络和几台云服务器上稳定运行了两年多期间帮助我发现并解决了三次ISP线路问题。最实用的改进是添加了Telegram通知功能——当我在外收到带宽异常提醒时可以立即让家人检查是否有人在下载大文件或者直接联系ISP报修。