Files
dock/测速中文
2025-11-01 16:34:31 +08:00

444 lines
14 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"