我来帮你编写一个使用 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}"
最后修改:2025 年 06 月 27 日
如果觉得我的文章对你有用,请随意赞赏