#!/bin/bash # 精准网络测速一键脚本 # 支持多系统:Ubuntu/Debian/CentOS/RHEL/Alpine # 功能:网络连通性测试、多节点延迟测试、Speedtest测速 # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # 错误处理函数 handle_error() { echo -e "${RED}❌ 错误: $1${NC}" exit 1 } # 检查命令是否存在 check_command() { if ! command -v "$1" &> /dev/null; then return 1 fi return 0 } # 安装必要工具 install_tools() { echo -e "${BLUE}📦 检查并安装必要工具...${NC}" # 检测包管理器 if check_command apt-get; then PM="apt-get" UPDATE_CMD="apt-get update" INSTALL_CMD="apt-get install -y" elif check_command yum; then PM="yum" UPDATE_CMD="yum update -y" INSTALL_CMD="yum install -y" elif check_command dnf; then PM="dnf" UPDATE_CMD="dnf update -y" INSTALL_CMD="dnf install -y" elif check_command apk; then PM="apk" UPDATE_CMD="apk update" INSTALL_CMD="apk add" else handle_error "未找到支持的包管理器" fi # 更新包列表 echo -e "${BLUE}更新包列表...${NC}" if ! $UPDATE_CMD >/dev/null 2>&1; then echo -e "${YELLOW}⚠️ 包列表更新失败,继续安装...${NC}" fi # 安装必要工具 TOOLS=("curl" "wget" "ping" "bc" "pip3" "python3") for tool in "${TOOLS[@]}"; do if ! check_command "$tool"; then echo -e "${BLUE}安装 $tool...${NC}" case $tool in "ping") if [ "$PM" = "apt-get" ]; then $INSTALL_CMD iputils-ping >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ iputils-ping 安装失败${NC}" elif [ "$PM" = "yum" ] || [ "$PM" = "dnf" ]; then $INSTALL_CMD iputils >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ iputils 安装失败${NC}" elif [ "$PM" = "apk" ]; then $INSTALL_CMD iputils >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ iputils 安装失败${NC}" fi ;; "bc") $INSTALL_CMD bc >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ bc 安装失败${NC}" ;; "pip3"|"python3") if [ "$PM" = "apt-get" ]; then $INSTALL_CMD python3 python3-pip >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ python3 安装失败${NC}" elif [ "$PM" = "yum" ] || [ "$PM" = "dnf" ]; then $INSTALL_CMD python3 python3-pip >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ python3 安装失败${NC}" elif [ "$PM" = "apk" ]; then $INSTALL_CMD python3 py3-pip >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ python3 安装失败${NC}" fi ;; *) $INSTALL_CMD "$tool" >/dev/null 2>&1 || echo -e "${YELLOW}⚠️ $tool 安装失败${NC}" ;; esac fi done } # 清理和修复speedtest安装 clean_speedtest() { echo -e "${BLUE}🧹 清理可能损坏的speedtest...${NC}" # 卸载各种版本的speedtest apt-get remove -y speedtest-cli 2>/dev/null pip uninstall -y speedtest-cli 2>/dev/null pip3 uninstall -y speedtest-cli 2>/dev/null rm -f /usr/local/bin/speedtest-cli rm -f /usr/bin/speedtest rm -f /usr/bin/speedtest-cli echo -e "${GREEN}✅ 清理完成${NC}" } # 安装speedtest - 增强版本 install_speedtest() { echo -e "${BLUE}📦 检查并安装speedtest...${NC}" # 检查是否已安装 if check_command speedtest; then echo -e "${GREEN}✅ speedtest 已安装${NC}" speedtest --version return 0 fi # 清理旧版本 clean_speedtest # 方法1: 安装官方ookla speedtest (首选) echo -e "${BLUE}尝试安装官方speedtest...${NC}" if check_command curl; then if curl -s https://install.speedtest.net/app/cli/install.deb.sh | bash >/dev/null 2>&1; then if $UPDATE_CMD >/dev/null 2>&1 && $INSTALL_CMD speedtest >/dev/null 2>&1; then echo -e "${GREEN}✅ 官方speedtest安装成功${NC}" speedtest --version return 0 fi fi fi # 方法2: 直接下载二进制文件 echo -e "${BLUE}尝试下载二进制speedtest...${NC}" if check_command wget; then ARCH=$(uname -m) if [ "$ARCH" = "x86_64" ]; then SPEEDTEST_URL="https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz" elif [ "$ARCH" = "aarch64" ]; then SPEEDTEST_URL="https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-aarch64.tgz" else SPEEDTEST_URL="https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-x86_64.tgz" fi if wget -q -O speedtest.tgz "$SPEEDTEST_URL" && \ tar -xzf speedtest.tgz && \ mv speedtest /usr/local/bin/ && \ chmod +x /usr/local/bin/speedtest; then echo -e "${GREEN}✅ 二进制speedtest安装成功${NC}" speedtest --version return 0 fi rm -f speedtest.tgz fi # 方法3: 使用pip安装 echo -e "${BLUE}尝试pip安装speedtest-cli...${NC}" if check_command pip3; then if pip3 install speedtest-cli >/dev/null 2>&1; then echo -e "${GREEN}✅ speedtest-cli pip安装成功${NC}" return 0 fi fi # 方法4: 使用包管理器安装 echo -e "${BLUE}尝试包管理器安装...${NC}" if [ "$PM" = "apt-get" ]; then if $INSTALL_CMD speedtest-cli >/dev/null 2>&1; then echo -e "${GREEN}✅ speedtest-cli 包管理器安装成功${NC}" return 0 fi elif [ "$PM" = "yum" ] || [ "$PM" = "dnf" ]; then if $INSTALL_CMD speedtest-cli >/dev/null 2>&1; then echo -e "${GREEN}✅ speedtest-cli 包管理器安装成功${NC}" return 0 fi fi echo -e "${YELLOW}⚠️ speedtest安装失败,将使用备用测速方法${NC}" return 1 } # 备用网络测速方法 backup_speed_test() { echo -e "${CYAN}🔄 使用备用方法进行网络测速...${NC}" # 测试下载速度到多个测速服务器 servers=( "http://speedtest.ftp.otenet.gr/files/test1Mb.db" "http://ipv4.download.thinkbroadband.com/1MB.zip" "http://proof.ovh.net/files/1Mb.dat" ) for server in "${servers[@]}"; do echo -e "${BLUE}测试服务器: $(basename $server)${NC}" if check_command wget; then start_time=$(date +%s) if wget -O /dev/null --timeout=10 --tries=2 "$server" >/dev/null 2>&1; then end_time=$(date +%s) duration=$((end_time - start_time)) if [ $duration -eq 0 ]; then duration=1 fi speed=$(echo "scale=2; 8 / $duration" | bc -l 2>/dev/null || echo "N/A") echo -e "${GREEN} 下载速度: ${speed} Mbps${NC}" break else echo -e "${YELLOW} 服务器不可用${NC}" fi fi done # 使用iperf3测试(如果可用) if check_command iperf3; then echo -e "${BLUE}使用iperf3测试...${NC}" iperf3 -c speedtest.serverius.net -p 5202 -t 5 -O 2 2>/dev/null | grep -E "sender|receiver" | head -2 fi } # 检查系统兼容性 check_system() { echo -e "${BLUE}🔍 检查系统环境...${NC}" # 检查操作系统 if [ -f /etc/os-release ]; then . /etc/os-release echo -e "${GREEN}✅ 操作系统: $PRETTY_NAME${NC}" else echo -e "${YELLOW}⚠️ 无法检测操作系统类型${NC}" fi # 检查架构 ARCH=$(uname -m) echo -e "${GREEN}✅ 系统架构: $ARCH${NC}" # 检查内核版本 KERNEL=$(uname -r) echo -e "${GREEN}✅ 内核版本: $KERNEL${NC}" } # 网络连通性测试 test_connectivity() { echo -e "${BLUE}🌐 测试网络连接...${NC}" # 测试多个DNS服务器 dns_servers=("223.5.5.5" "114.114.114.114" "8.8.8.8" "1.1.1.1") connected=false for dns in "${dns_servers[@]}"; do if ping -c 2 -W 3 "$dns" >/dev/null 2>&1; then echo -e "${GREEN}✅ 网络连接正常 (通过 $dns)${NC}" connected=true break fi done if [ "$connected" = false ]; then handle_error "网络连接失败,请检查网络设置" fi } # 多节点延迟测试 test_latency() { echo -e "${CYAN}🎯 多节点延迟测试${NC}" nodes=("阿里DNS:223.5.5.5" "114DNS:114.114.114.114" "腾讯DNS:119.29.29.29" "Cloudflare:1.1.1.1" "Google DNS:8.8.8.8") for node in "${nodes[@]}"; do name="${node%:*}" ip="${node#*:}" echo -e "${BLUE}测试 $name...${NC}" if ping -c 4 -W 2 "$ip" >/dev/null 2>&1; then result=$(ping -c 4 -W 2 "$ip" 2>/dev/null | grep "min/avg/max" | awk -F'/' '{print " 平均延迟: "$5"ms"}') if [ -n "$result" ]; then latency=$(echo "$result" | grep -o '[0-9.]*') if command -v bc >/dev/null 2>&1 && [ -n "$latency" ]; then if (( $(echo "$latency < 50" | bc -l 2>/dev/null) )); then echo -e "${GREEN}$result ✅${NC}" elif (( $(echo "$latency < 100" | bc -l 2>/dev/null) )); then echo -e "${GREEN}$result 👍${NC}" elif (( $(echo "$latency < 200" | bc -l 2>/dev/null) )); then echo -e "${YELLOW}$result ⚠️${NC}" else echo -e "${RED}$result ❌${NC}" fi else # 如果没有bc,简单显示结果 echo -e "${GREEN}$result${NC}" fi else echo -e "${YELLOW} 延迟测试结果解析失败${NC}" fi else echo -e "${RED} 测试失败${NC}" fi done } # Speedtest测速 - 增强版本 test_speed() { echo -e "${CYAN}🚀 进行Speedtest测速...${NC}" # 调试信息 echo -e "${BLUE}可用的speedtest命令:${NC}" which speedtest 2>/dev/null && echo -e " speedtest: $(speedtest --version 2>/dev/null || echo '无法获取版本')" which speedtest-cli 2>/dev/null && echo -e " speedtest-cli: $(speedtest-cli --version 2>/dev/null || echo '无法获取版本')" # 检查是否有可用的speedtest命令 SPEEDTEST_CMD="" if check_command speedtest; then SPEEDTEST_CMD="speedtest --accept-license --accept-gdpr --simple" elif check_command speedtest-cli; then SPEEDTEST_CMD="speedtest-cli --simple" elif [ -f /usr/local/bin/speedtest ]; then SPEEDTEST_CMD="/usr/local/bin/speedtest --accept-license --accept-gdpr --simple" fi if [ -n "$SPEEDTEST_CMD" ]; then echo -e "${BLUE}使用命令: $SPEEDTEST_CMD${NC}" # 设置超时,防止卡住 timeout 60 bash -c "$SPEEDTEST_CMD" 2>/dev/null result=$? if [ $result -eq 0 ]; then echo -e "${GREEN}✅ speedtest测速成功${NC}" elif [ $result -eq 124 ]; then echo -e "${YELLOW}⚠️ speedtest测速超时${NC}" backup_speed_test else echo -e "${YELLOW}⚠️ speedtest测速失败,错误码: $result${NC}" backup_speed_test fi else echo -e "${YELLOW}⚠️ 未找到speedtest命令${NC}" backup_speed_test fi } # 显示系统信息 show_system_info() { echo -e "${PURPLE}" echo "==================================================" echo " 🌈 精准网络测速脚本 v3.0" echo " 增强版 - 多方法测速 | 自动修复 | 备用方案" echo " 支持: Ubuntu/Debian/CentOS/RHEL" echo "==================================================" echo -e "${NC}" check_system echo "" } # 显示使用说明 show_usage() { echo -e "${GREEN}使用方法:${NC}" echo -e " $0 [选项]" echo -e "" echo -e "${GREEN}选项:${NC}" echo -e " -h, --help 显示此帮助信息" echo -e " -v, --version 显示版本信息" echo -e " -f, --force 强制重新安装speedtest" echo -e "" echo -e "${GREEN}功能:${NC}" echo -e " ✅ 系统环境检测" echo -e " ✅ 自动安装依赖工具" echo -e " ✅ 网络连通性测试" echo -e " ✅ 多节点延迟测试" echo -e " ✅ Speedtest网速测试 (多方法)" echo -e " ✅ 备用测速方案" echo -e " ✅ 自动修复安装问题" echo -e "" echo -e "${GREEN}示例:${NC}" echo -e " $0 # 运行完整测试" echo -e " $0 --force # 强制重新安装speedtest" echo -e " $0 --help # 显示帮助" } # 显示版本信息 show_version() { echo -e "${GREEN}精准网络测速脚本 v3.0${NC}" echo -e "增强版 - 多方法测速 | 自动修复 | 备用方案" } # 强制重新安装speedtest force_reinstall_speedtest() { echo -e "${YELLOW}🔄 强制重新安装speedtest...${NC}" clean_speedtest install_speedtest } # 主函数 main() { # 处理命令行参数 case "${1:-}" in -h|--help) show_usage exit 0 ;; -v|--version) show_version exit 0 ;; -f|--force) FORCE_REINSTALL=true ;; *) # 正常执行 ;; esac show_system_info install_tools echo "" if [ "$FORCE_REINSTALL" = true ]; then force_reinstall_speedtest else install_speedtest fi echo "" test_connectivity echo "" test_latency echo "" test_speed echo "" echo -e "${PURPLE}==================================================${NC}" echo -e "${PURPLE} 测试完成 🌟${NC}" echo -e "${PURPLE}==================================================${NC}" } # 设置陷阱,确保脚本退出时重置颜色 trap 'echo -e "${NC}"' EXIT # 运行主函数 main "$@"