我来帮你编写一个使用 speedtest-cli 来消耗服务器流量的 Linux 脚本。我为你创建了一个功能完整的流量消耗脚本。这个脚本具有以下特点:
主要功能
- 可控制运行时间:通过
-t
参数设置运行时长 - 可调节测试间隔:通过
-i
参数控制测试频率 - 多种测试模式:支持仅下载、仅上传或完整测试
- 服务器选择:可指定特定的 speedtest 服务器
- 实时统计:显示测试进度和剩余时间
使用方法
1. 保存并设置权限
chmod +x traffic_consumer.sh
2. 基本使用示例
# 运行10分钟,每30秒测试一次(默认)
./traffic_consumer.sh -t 600
# 运行5分钟,每60秒测试一次
./traffic_consumer.sh -t 300 -i 60
# 仅执行下载测试,运行3分钟
./traffic_consumer.sh -t 180 -d
# 使用详细输出模式
./traffic_consumer.sh -t 300 -v
3. 高级选项
-s <服务器ID>
:指定特定服务器-d
:仅下载测试(消耗下行流量)-u
:仅上传测试(消耗上行流量)-v
:详细输出模式
安全特性
- 信号处理:支持 Ctrl+C 安全退出
- 参数验证:检查输入参数的合法性
- 依赖检查:自动检查 speedtest-cli 是否安装
- 时间管理:精确控制运行时间,避免超时
这个脚本可以有效地消耗服务器的网络流量,同时提供良好的控制和监控功能。你可以根据需要调整参数来达到理想的流量消耗效果。
#!/bin/bash
# 流量消耗脚本 - 使用 speedtest-cli
# 作者: 自动生成
# 版本: 1.0
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 显示帮助信息
show_help() {
echo -e "${BLUE}流量消耗脚本使用说明${NC}"
echo "使用方法: $0 [选项]"
echo ""
echo "选项:"
echo " -t, --time <秒数> 设置运行时间(秒),默认300秒"
echo " -i, --interval <秒数> 设置测试间隔(秒),默认30秒"
echo " -s, --server <服务器ID> 指定speedtest服务器ID(可选)"
echo " -d, --download-only 仅执行下载测试"
echo " -u, --upload-only 仅执行上传测试"
echo " -v, --verbose 显示详细输出"
echo " -h, --help 显示此帮助信息"
echo ""
echo "示例:"
echo " $0 -t 600 -i 60 运行10分钟,每60秒测试一次"
echo " $0 -t 300 -d 运行5分钟,仅下载测试"
echo " $0 -s 12345 -t 120 使用指定服务器运行2分钟"
}
# 检查speedtest-cli是否安装
check_speedtest() {
if ! command -v speedtest-cli &> /dev/null; then
echo -e "${RED}错误: speedtest-cli 未安装${NC}"
echo -e "${YELLOW}请先安装 speedtest-cli:${NC}"
echo "Ubuntu/Debian: sudo apt install speedtest-cli"
echo "CentOS/RHEL: sudo yum install speedtest-cli"
echo "或使用pip: pip install speedtest-cli"
exit 1
fi
}
# 格式化时间显示
format_time() {
local seconds=$1
local hours=$((seconds / 3600))
local minutes=$(((seconds % 3600) / 60))
local secs=$((seconds % 60))
if [ $hours -gt 0 ]; then
printf "%02d:%02d:%02d" $hours $minutes $secs
else
printf "%02d:%02d" $minutes $secs
fi
}
# 格式化流量显示
format_bytes() {
local bytes=$1
if [ $bytes -ge 1073741824 ]; then
echo "$(echo "scale=2; $bytes/1073741824" | bc) GB"
elif [ $bytes -ge 1048576 ]; then
echo "$(echo "scale=2; $bytes/1048576" | bc) MB"
elif [ $bytes -ge 1024 ]; then
echo "$(echo "scale=2; $bytes/1024" | bc) KB"
else
echo "$bytes B"
fi
}
# 执行speedtest测试
run_speedtest() {
local cmd="speedtest-cli"
# 添加服务器参数
if [ ! -z "$SERVER_ID" ]; then
cmd="$cmd --server $SERVER_ID"
fi
# 添加测试类型参数
if [ "$DOWNLOAD_ONLY" = true ]; then
cmd="$cmd --no-upload"
elif [ "$UPLOAD_ONLY" = true ]; then
cmd="$cmd --no-download"
fi
# 添加详细输出参数
if [ "$VERBOSE" = false ]; then
cmd="$cmd --simple"
fi
# 执行测试
if [ "$VERBOSE" = true ]; then
echo -e "${BLUE}执行命令: $cmd${NC}"
fi
eval $cmd
}
# 信号处理函数
cleanup() {
echo -e "\n${YELLOW}接收到停止信号,正在清理...${NC}"
local end_time=$(date +%s)
local actual_runtime=$((end_time - start_time))
echo -e "${GREEN}==================== 运行统计 ====================${NC}"
echo -e "${GREEN}实际运行时间: $(format_time $actual_runtime)${NC}"
echo -e "${GREEN}完成测试次数: $test_count${NC}"
echo -e "${GREEN}脚本已安全退出${NC}"
exit 0
}
# 设置默认值
DURATION=300 # 默认运行5分钟
INTERVAL=30 # 默认间隔30秒
SERVER_ID="" # 服务器ID
DOWNLOAD_ONLY=false # 仅下载
UPLOAD_ONLY=false # 仅上传
VERBOSE=false # 详细输出
# 解析命令行参数
while [[ $# -gt 0 ]]; do
case $1 in
-t|--time)
DURATION="$2"
shift 2
;;
-i|--interval)
INTERVAL="$2"
shift 2
;;
-s|--server)
SERVER_ID="$2"
shift 2
;;
-d|--download-only)
DOWNLOAD_ONLY=true
shift
;;
-u|--upload-only)
UPLOAD_ONLY=true
shift
;;
-v|--verbose)
VERBOSE=true
shift
;;
-h|--help)
show_help
exit 0
;;
*)
echo -e "${RED}未知参数: $1${NC}"
show_help
exit 1
;;
esac
done
# 验证参数
if ! [[ "$DURATION" =~ ^[0-9]+$ ]] || [ "$DURATION" -le 0 ]; then
echo -e "${RED}错误: 运行时间必须是正整数${NC}"
exit 1
fi
if ! [[ "$INTERVAL" =~ ^[0-9]+$ ]] || [ "$INTERVAL" -le 0 ]; then
echo -e "${RED}错误: 测试间隔必须是正整数${NC}"
exit 1
fi
if [ "$DOWNLOAD_ONLY" = true ] && [ "$UPLOAD_ONLY" = true ]; then
echo -e "${RED}错误: 不能同时指定仅下载和仅上传${NC}"
exit 1
fi
# 检查依赖
check_speedtest
# 检查bc命令(用于计算)
if ! command -v bc &> /dev/null; then
echo -e "${YELLOW}警告: bc 命令未安装,流量统计功能受限${NC}"
fi
# 设置信号处理
trap cleanup SIGINT SIGTERM
# 开始执行
echo -e "${GREEN}==================== 流量消耗脚本 ====================${NC}"
echo -e "${GREEN}运行时间: $(format_time $DURATION)${NC}"
echo -e "${GREEN}测试间隔: ${INTERVAL}秒${NC}"
if [ ! -z "$SERVER_ID" ]; then
echo -e "${GREEN}指定服务器: $SERVER_ID${NC}"
fi
if [ "$DOWNLOAD_ONLY" = true ]; then
echo -e "${GREEN}测试模式: 仅下载${NC}"
elif [ "$UPLOAD_ONLY" = true ]; then
echo -e "${GREEN}测试模式: 仅上传${NC}"
else
echo -e "${GREEN}测试模式: 上传+下载${NC}"
fi
echo -e "${GREEN}=================================================${NC}"
# 记录开始时间
start_time=$(date +%s)
end_time=$((start_time + DURATION))
test_count=0
echo -e "${BLUE}开始时间: $(date)${NC}"
echo -e "${BLUE}预计结束: $(date -d "@$end_time")${NC}"
echo ""
# 主循环
while [ $(date +%s) -lt $end_time ]; do
test_count=$((test_count + 1))
current_time=$(date +%s)
remaining_time=$((end_time - current_time))
echo -e "${YELLOW}[$(date '+%H:%M:%S')] 第 $test_count 次测试 (剩余时间: $(format_time $remaining_time))${NC}"
echo "----------------------------------------"
# 执行speedtest
run_speedtest
echo "----------------------------------------"
# 检查是否还有足够时间进行下一次测试
current_time=$(date +%s)
if [ $((current_time + INTERVAL)) -ge $end_time ]; then
echo -e "${YELLOW}剩余时间不足,提前结束${NC}"
break
fi
# 等待间隔时间
echo -e "${BLUE}等待 ${INTERVAL} 秒...${NC}"
sleep $INTERVAL
echo ""
done
# 正常结束
echo -e "\n${GREEN}==================== 测试完成 ====================${NC}"
actual_end_time=$(date +%s)
actual_runtime=$((actual_end_time - start_time))
echo -e "${GREEN}开始时间: $(date -d "@$start_time")${NC}"
echo -e "${GREEN}结束时间: $(date -d "@$actual_end_time")${NC}"
echo -e "${GREEN}实际运行时间: $(format_time $actual_runtime)${NC}"
echo -e "${GREEN}完成测试次数: $test_count${NC}"
echo -e "${GREEN}脚本执行完成!${NC}"