#!/usr/bin/env bash # vpscesu.com 一键 VPS 测试脚本 # 本脚本只做三件事:安装并调用开源的融合怪 Go 版 (github.com/oneclickvirt/ecs, GPL-3.0), # 把它生成的 goecs.txt 上传到 vpscesu.com,返回一个带解读的分享链接。 # 不修改系统配置,不常驻任何进程。本文件就是全部代码,可以先 curl -sL https://vpscesu.com 读完再运行。 # # 用法: # bash <(curl -sL https://vpscesu.com) 全套测试 # bash <(curl -sL https://vpscesu.com) -r 只测回程线路和路由 # bash <(curl -sL https://vpscesu.com) -m 只测流媒体 / AI 解锁 # bash <(curl -sL https://vpscesu.com) -i 只测 IP 质量 # bash <(curl -sL https://vpscesu.com) -n 不上传,只在本机显示结果 # 如果提示 Syntax error: "(" unexpected,说明当前不是 bash(比如 sh / dash / ash),改用: # curl -sL https://vpscesu.com | bash 带参数: curl -sL https://vpscesu.com | bash -s -- -r set -u SITE="${VPSCESU_SITE:-https://vpscesu.com}" WORKDIR="$(mktemp -d /tmp/vpscesu.XXXXXX)" UPLOAD=1 MODE="all" while getopts "rmin" opt; do case "$opt" in r) MODE="route" ;; m) MODE="unlock" ;; i) MODE="ip" ;; n) UPLOAD=0 ;; *) echo "用法: bash <(curl -sL https://vpscesu.com) [-r 只测回程线路] [-m 只测流媒体/AI 解锁] [-i 只测 IP 质量] [-n 不上传]"; exit 1 ;; esac done cleanup() { rm -rf "$WORKDIR"; } trap cleanup EXIT red() { printf '\033[31m%s\033[0m\n' "$*"; } green() { printf '\033[32m%s\033[0m\n' "$*"; } # 国内云服务器默认登录的常常不是 root。实测(腾讯云 Ubuntu):sudo bash <(curl ...) 会报 /dev/fd/63 不存在, # 管道写法 curl ... | sudo bash 可以正常运行,所以这里直接给出能用的那条命令,并带上用户原本的参数。 if [ "$(id -u)" -ne 0 ]; then FLAGS="" case "$MODE" in route) FLAGS=" -r" ;; unlock) FLAGS=" -m" ;; ip) FLAGS=" -i" ;; esac [ "$UPLOAD" -eq 0 ] && FLAGS="$FLAGS -n" red "需要 root 权限。当前不是 root 用户,请改用下面这条命令:" if [ -n "$FLAGS" ]; then echo " curl -sL $SITE | sudo bash -s --$FLAGS"; else echo " curl -sL $SITE | sudo bash"; fi echo "(注意:sudo bash <(curl ...) 这种写法会报 /dev/fd 错误,不能用。也可以先执行 sudo -i 切换到 root 再运行原命令。)" exit 1 fi command -v curl >/dev/null 2>&1 || { red "缺少 curl,请先安装:apt install -y curl 或 yum install -y curl"; exit 1; } # 新开的机器首次开机常在后台自动更新,占着 apt 锁会导致安装失败,这里等它结束 if command -v fuser >/dev/null 2>&1; then waited=0 while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1; do [ "$waited" -eq 0 ] && echo "系统正在后台自动更新,等待它结束……" sleep 3; waited=$((waited + 3)) [ "$waited" -ge 300 ] && break done fi cd "$WORKDIR" || exit 1 if ! command -v goecs >/dev/null 2>&1; then echo "正在安装融合怪测试程序……" export noninteractive=true # 国内服务器连 GitHub 时好时坏(同一台国内电脑实测:一天超时、一天正常)。上游在腾讯 cnb.cool 上有国内镜像, # 实测国内下载 18 MB/s;但上游在非交互模式下默认不启用它,它用来判断"是否在国内"的接口在国内也返回 403。 # 所以这里自己判断:问本站这台机器的国家码(来自 Cloudflare),在中国大陆就显式打开上游的国内镜像开关 CN=true。 # 也可以手动指定: CN=true bash <(curl -sL https://vpscesu.com) if [ -z "${CN:-}" ]; then LOC="$(curl -s -m 6 "$SITE/geo" 2>/dev/null | tr -cd 'A-Z' | cut -c1-2)" [ "$LOC" = "CN" ] && CN=true fi GH=https://raw.githubusercontent.com/oneclickvirt/ecs/master/goecs.sh CNB=https://cnb.cool/oneclickvirt/ecs/-/git/raw/main/goecs.sh # 限时 8 秒连不上就换下一个来源,并确认下到的确实是脚本而不是错误页 fetch_installer() { curl -sL --connect-timeout 8 -m 40 "$1" -o goecs.sh && head -1 goecs.sh | grep -q '^#!'; } if [ "${CN:-}" = "true" ]; then export CN echo "检测到国内服务器,使用国内镜像安装……" fetch_installer "$CNB" || fetch_installer "https://cdn.spiritlhl.net/$GH" || fetch_installer "$GH" else fetch_installer "$GH" || fetch_installer "https://cdn.spiritlhl.net/$GH" || fetch_installer "$CNB" fi || { red "下载融合怪安装脚本失败:GitHub 和两个镜像都连不上,请检查这台机器的网络"; exit 1; } chmod +x goecs.sh ./goecs.sh install >install.log 2>&1 fi # 上游安装器会在 $HOME 留一份 goecs;如果 PATH 里的被删过,它会判定"已是最新"而不重装,这里兜底直接用那一份 GOECS="$(command -v goecs 2>/dev/null || true)" if [ -z "$GOECS" ]; then for c in "$HOME/goecs" /root/goecs "$WORKDIR/goecs"; do [ -x "$c" ] && { GOECS="$c"; break; } done fi [ -n "$GOECS" ] || { red "安装失败,日志如下:"; cat install.log 2>/dev/null; echo "解决不了的话,把上面的日志贴到这里告诉我们: $SITE/#feedback"; exit 1; } COMMON="-menu=false -l=zh -upload=false" OFF="-basic=false -cpu=false -memory=false -disk=false -ut=false -security=false -email=false -backtrace=false -nt3=false -speed=false" case "$MODE" in all) ARGS="$COMMON" ;; route) ARGS="$COMMON $OFF -basic=true -backtrace=true -nt3=true" ;; unlock) ARGS="$COMMON $OFF -basic=true -ut=true" ;; ip) ARGS="$COMMON $OFF -basic=true -security=true" ;; esac # shellcheck disable=SC2086 "$GOECS" $ARGS [ -s goecs.txt ] || { red "没有生成结果文件"; exit 1; } if [ "$UPLOAD" -ne 1 ]; then # 工作目录退出时会被清理,-n 模式把结果留给用户 cp goecs.txt "$HOME/goecs.txt" 2>/dev/null && echo "未上传。完整结果已保存到 $HOME/goecs.txt" exit 0 fi echo echo "正在上传结果并生成解读……" RESP="$(curl -s -m 30 -X POST -H 'Content-Type: text/plain; charset=utf-8' \ -H "X-Vpscesu-Mode: $MODE" -H "X-Vpscesu-Test: ${VPSCESU_TEST:-0}" --data-binary @goecs.txt "$SITE/api/upload")" case "$RESP" in http*) # 链接只在终端显示这一次,顺手存一份到本机,关掉终端后还能找回 echo "$(date '+%F %T') $RESP" >> "$HOME/vpscesu-report.txt" 2>/dev/null || true echo green "==================================================" green " 测试完成,你的解读报告:" green " $RESP" green "==================================================" echo " 用浏览器打开上面的链接即可查看。链接已保存到 $HOME/vpscesu-report.txt" echo " 报告链接不公开、不会被搜索引擎收录。测试数据会匿名计入本站统计(不含 IP);不想上传请加 -n。" ;; *) # 工作目录退出时会被清理,失败时把结果挪到用户目录 cp goecs.txt "$HOME/goecs.txt" 2>/dev/null red "上传失败:${RESP:-无响应}。测试结果已保存在本机:$HOME/goecs.txt" echo " 反复失败的话,欢迎告诉我们: $SITE/#feedback" ;; esac