#!/usr/bin/env bash ver="2022.06.09" changeLog="融合怪四代目(集合百家之长)(专为测评频道小鸡而生)" checkroot(){ [[ $EUID -ne 0 ]] && echo -e "${RED}请使用 root 用户运行本脚本!${PLAIN}" && exit 1 } checksystem() { if [ -f /etc/redhat-release ]; then release="centos" elif cat /etc/issue | grep -Eqi "debian"; then release="debian" elif cat /etc/issue | grep -Eqi "ubuntu"; then release="ubuntu" elif cat /etc/issue | grep -Eqi "centos|red hat|redhat"; then release="centos" elif cat /proc/version | grep -Eqi "debian"; then release="debian" elif cat /proc/version | grep -Eqi "ubuntu"; then release="ubuntu" elif cat /proc/version | grep -Eqi "centos|red hat|redhat"; then release="centos" fi } checkpython() { if [ ! -e '/usr/bin/python' ]; then echo "正在安装 Python" if [ "${release}" == "centos" ]; then yum update > /dev/null 2>&1 yum -y install python > /dev/null 2>&1 else apt-get update > /dev/null 2>&1 apt-get -y install python > /dev/null 2>&1 fi fi } checkcurl() { if [ ! -e '/usr/bin/curl' ]; then echo "正在安装 Curl" if [ "${release}" == "centos" ]; then yum update > /dev/null 2>&1 yum -y install curl > /dev/null 2>&1 else apt-get update > /dev/null 2>&1 apt-get -y install curl > /dev/null 2>&1 fi fi } checkwget() { if [ ! -e '/usr/bin/wget' ]; then echo "正在安装 Wget" if [ "${release}" == "centos" ]; then yum update > /dev/null 2>&1 yum -y install wget > /dev/null 2>&1 else apt-get update > /dev/null 2>&1 apt-get -y install wget > /dev/null 2>&1 fi fi } checkspeedtest() { if [ ! -e './speedtest-cli/speedtest' ]; then echo "正在安装 Speedtest-cli" arch=$(uname -m) if [ "${arch}" == "i686" ]; then arch="i386" fi wget --no-check-certificate -qO speedtest.tgz https://cdn.jsdelivr.net/gh/oooldking/script@1.1.7/speedtest_cli/ookla-speedtest-1.0.0-${arch}-linux.tgz > /dev/null 2>&1 # wget --no-check-certificate -qO speedtest.tgz https://bintray.com/ookla/download/download_file?file_path=ookla-speedtest-1.0.0-${arch}-linux.tgz > /dev/null 2>&1 fi mkdir -p speedtest-cli && tar zxvf speedtest.tgz -C ./speedtest-cli/ > /dev/null 2>&1 && chmod a+rx ./speedtest-cli/speedtest } test_area=("广州电信" "广州联通" "广州移动") test_ip=("58.60.188.222" "210.21.196.6" "120.196.165.2") TEMP_FILE='ip.test' TEMP_FILE2='backtrace.test' SystemInfo_GetOSRelease() { if [ -f "/etc/centos-release" ]; then # CentOS Var_OSRelease="centos" local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3,$4}')" if [ "$(rpm -qa | grep -o el6 | sort -u)" = "el6" ]; then Var_CentOSELRepoVersion="6" local Var_OSReleaseVersion="$(cat /etc/centos-release | awk '{print $3}')" elif [ "$(rpm -qa | grep -o el7 | sort -u)" = "el7" ]; then Var_CentOSELRepoVersion="7" local Var_OSReleaseVersion="$(cat /etc/centos-release | awk '{print $4}')" elif [ "$(rpm -qa | grep -o el8 | sort -u)" = "el8" ]; then Var_CentOSELRepoVersion="8" local Var_OSReleaseVersion="$(cat /etc/centos-release | awk '{print $4}')" else local Var_CentOSELRepoVersion="unknown" local Var_OSReleaseVersion="" fi local Var_OSReleaseArch="$(arch)" LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" elif [ -f "/etc/redhat-release" ]; then # RedHat Var_OSRelease="rhel" local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3,$4}')" if [ "$(rpm -qa | grep -o el6 | sort -u)" = "el6" ]; then Var_RedHatELRepoVersion="6" local Var_OSReleaseVersion="$(cat /etc/redhat-release | awk '{print $3}')" elif [ "$(rpm -qa | grep -o el7 | sort -u)" = "el7" ]; then Var_RedHatELRepoVersion="7" local Var_OSReleaseVersion="$(cat /etc/redhat-release | awk '{print $4}')" elif [ "$(rpm -qa | grep -o el8 | sort -u)" = "el8" ]; then Var_RedHatELRepoVersion="8" local Var_OSReleaseVersion="$(cat /etc/redhat-release | awk '{print $4}')" else local Var_RedHatELRepoVersion="unknown" local Var_OSReleaseVersion="" fi local Var_OSReleaseArch="$(arch)" LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" elif [ -f "/etc/fedora-release" ]; then # Fedora Var_OSRelease="fedora" local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3}')" local Var_OSReleaseVersion="$(cat /etc/fedora-release | awk '{print $3,$4,$5,$6,$7}')" local Var_OSReleaseArch="$(arch)" LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" elif [ -f "/etc/lsb-release" ]; then # Ubuntu Var_OSRelease="ubuntu" local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/NAME/{print $3}' | head -n1)" local Var_OSReleaseVersion="$(cat /etc/os-release | awk -F '[= "]' '/VERSION/{print $3,$4,$5,$6,$7}' | head -n1)" local Var_OSReleaseArch="$(arch)" LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" Var_OSReleaseVersion_Short="$(cat /etc/lsb-release | awk -F '[= "]' '/DISTRIB_RELEASE/{print $2}')" elif [ -f "/etc/debian_version" ]; then # Debian Var_OSRelease="debian" local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/PRETTY_NAME/{print $3,$4}')" local Var_OSReleaseVersion="$(cat /etc/debian_version | awk '{print $1}')" local Var_OSReleaseVersionShort="$(cat /etc/debian_version | awk '{printf "%d\n",$1}')" if [ "${Var_OSReleaseVersionShort}" = "7" ]; then Var_OSReleaseVersion_Short="7" Var_OSReleaseVersion_Codename="wheezy" local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Wheezy\"" elif [ "${Var_OSReleaseVersionShort}" = "8" ]; then Var_OSReleaseVersion_Short="8" Var_OSReleaseVersion_Codename="jessie" local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Jessie\"" elif [ "${Var_OSReleaseVersionShort}" = "9" ]; then Var_OSReleaseVersion_Short="9" Var_OSReleaseVersion_Codename="stretch" local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Stretch\"" elif [ "${Var_OSReleaseVersionShort}" = "10" ]; then Var_OSReleaseVersion_Short="10" Var_OSReleaseVersion_Codename="buster" local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Buster\"" else Var_OSReleaseVersion_Short="sid" Var_OSReleaseVersion_Codename="sid" local Var_OSReleaseFullName="${Var_OSReleaseFullName} \"Sid (Testing)\"" fi local Var_OSReleaseArch="$(arch)" LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" elif [ -f "/etc/alpine-release" ]; then # Alpine Linux Var_OSRelease="alpinelinux" local Var_OSReleaseFullName="$(cat /etc/os-release | awk -F '[= "]' '/NAME/{print $3,$4}' | head -n1)" local Var_OSReleaseVersion="$(cat /etc/alpine-release | awk '{print $1}')" local Var_OSReleaseArch="$(arch)" LBench_Result_OSReleaseFullName="$Var_OSReleaseFullName $Var_OSReleaseVersion ($Var_OSReleaseArch)" else Var_OSRelease="unknown" # 未知系统分支 LBench_Result_OSReleaseFullName="[Error: Unknown Linux Branch !]" fi } function Global_UnlockTest() { echo "" echo "============[ Multination ]============" MediaUnlockTest_Dazn ${1} MediaUnlockTest_HotStar ${1} MediaUnlockTest_DisneyPlus ${1} MediaUnlockTest_Netflix ${1} MediaUnlockTest_YouTube_Premium ${1} MediaUnlockTest_PrimeVideo_Region ${1} MediaUnlockTest_TVBAnywhere ${1} MediaUnlockTest_iQYI_Region ${1} MediaUnlockTest_Viu.com ${1} MediaUnlockTest_YouTube_CDN ${1} MediaUnlockTest_NetflixCDN ${1} MediaUnlockTest_Spotify ${1} GameTest_Steam ${1} echo "=======================================" } # =============== 检查 SysBench 组件 =============== Check_SysBench() { if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then SystemInfo_GetOSRelease SystemInfo_GetSystemBit if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ]; then echo -e "${Msg_Warning}Sysbench Module not found, installing ..." yum -y install epel-release yum -y install sysbench elif [ "${Var_OSRelease}" = "ubuntu" ]; then echo -e "${Msg_Warning}Sysbench Module not found, installing ..." apt-get install -y sysbench elif [ "${Var_OSRelease}" = "debian" ]; then echo -e "${Msg_Warning}Sysbench Module not found, installing ..." local mirrorbase="https://raindrop.ilemonrain.com/LemonBench" local componentname="Sysbench" local version="1.0.19-1" local arch="debian" local codename="${Var_OSReleaseVersion_Codename}" local bit="${LBench_Result_SystemBit_Full}" local filenamebase="sysbench" local filename="${filenamebase}_${version}_${bit}.deb" local downurl="${mirrorbase}/include/${componentname}/${version}/${arch}/${codename}/${filename}" mkdir -p ${WorkDir}/download/ pushd ${WorkDir}/download/ >/dev/null wget -U "${UA_LemonBench}" -O ${filenamebase}_${version}_${bit}.deb ${downurl} dpkg -i ./${filename} apt-get install -f -y popd if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then echo -e "${Msg_Warning}Sysbench Module Install Failed!" fi elif [ "${Var_OSRelease}" = "fedora" ]; then echo -e "${Msg_Warning}Sysbench Module not found, installing ..." dnf -y install sysbench elif [ "${Var_OSRelease}" = "alpinelinux" ]; then echo -e "${Msg_Warning}Sysbench Module not found, installing ..." echo -e "${Msg_Warning}SysBench Current not support Alpine Linux, Skipping..." Var_Skip_SysBench="1" fi fi # 垂死挣扎 (尝试编译安装) if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then echo -e "${Msg_Warning}Sysbench Module install Failure, trying compile modules ..." Check_Sysbench_InstantBuild >/dev/null 2>&1 fi # 最终检测 if [ ! -f "/usr/bin/sysbench" ] && [ ! -f "/usr/local/bin/sysbench" ]; then echo -e "${Msg_Error}SysBench Moudle install Failure! Try Restart Bench or Manually install it! (/usr/bin/sysbench)" # exit 1 fi } Check_Sysbench_InstantBuild() { SystemInfo_GetOSRelease SystemInfo_GetCPUInfo if [ "${Var_OSRelease}" = "centos" ] || [ "${Var_OSRelease}" = "rhel" ]; then echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" echo -e "${Msg_Info}Preparing compile enviorment ..." yum install -y epel-release yum install -y wget curl make gcc gcc-c++ make automake libtool pkgconfig libaio-devel echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" echo -e "${Msg_Info}Downloading Source code (Version 1.0.17)..." mkdir -p /tmp/_LBench/src/ wget -U "${UA_LemonBench}" -O /tmp/_LBench/src/sysbench.zip https://github.com/akopytov/sysbench/archive/1.0.17.zip echo -e "${Msg_Info}Compiling Sysbench Module ..." cd /tmp/_LBench/src/ unzip sysbench.zip && cd sysbench-1.0.17 ./autogen.sh && ./configure --without-mysql && make -j8 && make install echo -e "${Msg_Info}Cleaning up ..." cd /tmp && rm -rf /tmp/_LBench/src/sysbench* >/dev/null 2>&1 elif [ "${Var_OSRelease}" = "ubuntu" ] || [ "${Var_OSRelease}" = "debian" ]; then echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" echo -e "${Msg_Info}Preparing compile enviorment ..." apt-get update apt -y install --no-install-recommends curl wget make automake libtool pkg-config libaio-dev unzip echo -e "${Msg_Info}Downloading Source code (Version 1.0.17)..." mkdir -p /tmp/_LBench/src/ wget -U "${UA_LemonBench}" -O /tmp/_LBench/src/sysbench.zip https://github.com/akopytov/sysbench/archive/1.0.17.zip echo -e "${Msg_Info}Compiling Sysbench Module ..." cd /tmp/_LBench/src/ unzip sysbench.zip && cd sysbench-1.0.17 ./autogen.sh && ./configure --without-mysql && make -j8 && make install echo -e "${Msg_Info}Cleaning up ..." cd /tmp && rm -rf /tmp/_LBench/src/sysbench* >/dev/null 2>&1 elif [ "${Var_OSRelease}" = "fedora" ]; then echo -e "${Msg_Info}Release Detected: ${Var_OSRelease}" echo -e "${Msg_Info}Preparing compile enviorment ..." dnf install -y wget curl gcc gcc-c++ make automake libtool pkgconfig libaio-devel echo -e "${Msg_Info}Downloading Source code (Version 1.0.17)..." mkdir -p /tmp/_LBench/src/ wget -U "${UA_LemonBench}" -O /tmp/_LBench/src/sysbench.zip https://github.com/akopytov/sysbench/archive/1.0.17.zip echo -e "${Msg_Info}Compiling Sysbench Module ..." cd /tmp/_LBench/src/ unzip sysbench.zip && cd sysbench-1.0.17 ./autogen.sh && ./configure --without-mysql && make -j8 && make install echo -e "${Msg_Info}Cleaning up ..." cd /tmp && rm -rf /tmp/_LBench/src/sysbench* >/dev/null 2>&1 else echo -e "${Msg_Error}Cannot compile on current enviorment! (Only Support CentOS/Debian/Ubuntu/Fedora) " fi } Function_CheckTracemode() { if [ "${Flag_TracerouteModeisSet}" = "1" ]; then if [ "${GlobalVar_TracerouteMode}" = "icmp" ]; then echo -e "${Msg_Info}Traceroute/BestTrace Tracemode is set to: ${Font_SkyBlue}ICMP Mode${Font_Suffix}" elif [ "${GlobalVar_TracerouteMode}" = "tcp" ]; then echo -e "${Msg_Info}Traceroute/BestTrace Tracemode is set to: ${Font_SkyBlue}TCP Mode${Font_Suffix}" fi else GlobalVar_TracerouteMode="tcp" fi } # =============== 测试启动与结束动作 =============== #Function_BenchFinish() { # # 清理临时文件 # LBench_Result_BenchFinishTime="$(date +"%Y-%m-%d %H:%M:%S")" # LBench_Result_BenchFinishTimestamp="$(date +%s)" # LBench_Result_TimeElapsedSec="$(echo "$LBench_Result_BenchFinishTimestamp $LBench_Result_BenchStartTimestamp" | awk '{print $1-$2}')" # echo -e " ${Msg_Info}${Font_Yellow}Bench Finish Time:${Font_Suffix} ${Font_SkyBlue}${LBench_Result_BenchFinishTime}${Font_Suffix}" # echo -e " ${Msg_Info}${Font_Yellow}Time Elapsed:${Font_Suffix} ${Font_SkyBlue}${LBench_Result_TimeElapsedSec} seconds${Font_Suffix}" #} # =============== SysBench - CPU性能 部分 =============== Run_SysBench_CPU() { # 调用方式: Run_SysBench_CPU "线程数" "测试时长(s)" "测试遍数" "说明" # 变量初始化 mkdir -p ${WorkDir}/SysBench/CPU/ >/dev/null 2>&1 maxtestcount="$3" local count="1" local TestScore="0" local TotalScore="0" # 运行测试 while [ $count -le $maxtestcount ]; do echo -e "\r ${Font_Yellow}$4: ${Font_Suffix}\t\t$count/$maxtestcount \c" local TestResult="$(sysbench --test=cpu --num-threads=$1 --cpu-max-prime=10000 --max-requests=1000000 --max-time=$2 run 2>&1)" local TestScore="$(echo ${TestResult} | grep -oE "events per second: [0-9]+" | grep -oE "[0-9]+")" local TotalScore="$(echo "${TotalScore} ${TestScore}" | awk '{printf "%d",$1+$2}')" let count=count+1 local TestResult="" local TestScore="0" done local ResultScore="$(echo "${TotalScore} ${maxtestcount}" | awk '{printf "%d",$1/$2}')" if [ "$1" = "1" ]; then echo -e "\r ${Font_Yellow}$4: ${Font_Suffix}\t\t${Font_SkyBlue}${ResultScore}${Font_Suffix} ${Font_Yellow}Scores${Font_Suffix}" echo -e " $4:\t\t\t${ResultScore} Scores" >>${WorkDir}/SysBench/CPU/result.txt elif [ "$1" -ge "2" ]; then echo -e "\r ${Font_Yellow}$4: ${Font_Suffix}\t\t${Font_SkyBlue}${ResultScore}${Font_Suffix} ${Font_Yellow}Scores${Font_Suffix}" echo -e " $4:\t\t${ResultScore} Scores" >>${WorkDir}/SysBench/CPU/result.txt fi } Function_SysBench_CPU_Fast() { mkdir -p ${WorkDir}/SysBench/CPU/ >/dev/null 2>&1 echo -e " ${Font_Yellow}-> CPU 测试中 (Fast Mode, 1-Pass @ 5sec)${Font_Suffix}\n" echo -e " -> CPU 测试中 (Fast Mode, 1-Pass @ 5sec)\n" >>${WorkDir}/SysBench/CPU/result.txt Run_SysBench_CPU "1" "5" "1" "1 线程测试(1核)得分" if [ "${LBench_Result_CPUThreadNumber}" -ge "2" ]; then Run_SysBench_CPU "${LBench_Result_CPUThreadNumber}" "5" "1" "${LBench_Result_CPUThreadNumber} 线程测试(多核)得分" elif [ "${LBench_Result_CPUProcessorNumber}" -ge "2" ]; then Run_SysBench_CPU "${LBench_Result_CPUProcessorNumber}" "5" "1" "${LBench_Result_CPUProcessorNumber} 线程测试(多核)得分" fi # 完成FLAG LBench_Flag_FinishSysBenchCPUFast="1" } # =============== SystemInfo模块 部分 =============== SystemInfo_GetHostname() { LBench_Result_Hostname="$(hostname)" } SystemInfo_GetCPUInfo() { mkdir -p ${WorkDir}/data >/dev/null 2>&1 cat /proc/cpuinfo >${WorkDir}/data/cpuinfo local ReadCPUInfo="cat ${WorkDir}/data/cpuinfo" LBench_Result_CPUModelName="$($ReadCPUInfo | awk -F ': ' '/model name/{print $2}' | sort -u)" local CPUFreqCount="$($ReadCPUInfo | awk -F ': ' '/cpu MHz/{print $2}' | sort -run | wc -l)" if [ "${CPUFreqCount}" -ge "2" ]; then local CPUFreqArray="$(cat /proc/cpuinfo | awk -F ': ' '/cpu MHz/{print $2}' | sort -run)" local CPUFreq_Min="$(echo "$CPUFreqArray" | grep -oE '[0-9]+.[0-9]{3}' | awk 'BEGIN {min = 2147483647} {if ($1+0 < min+0) min=$1} END {print min}')" local CPUFreq_Max="$(echo "$CPUFreqArray" | grep -oE '[0-9]+.[0-9]{3}' | awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1} END {print max}')" LBench_Result_CPUFreqMinGHz="$(echo $CPUFreq_Min | awk '{printf "%.2f\n",$1/1000}')" LBench_Result_CPUFreqMaxGHz="$(echo $CPUFreq_Max | awk '{printf "%.2f\n",$1/1000}')" Flag_DymanicCPUFreqDetected="1" else LBench_Result_CPUFreqMHz="$($ReadCPUInfo | awk -F ': ' '/cpu MHz/{print $2}' | sort -u)" LBench_Result_CPUFreqGHz="$(echo $LBench_Result_CPUFreqMHz | awk '{printf "%.2f\n",$1/1000}')" Flag_DymanicCPUFreqDetected="0" fi LBench_Result_CPUCacheSize="$($ReadCPUInfo | awk -F ': ' '/cache size/{print $2}' | sort -u)" LBench_Result_CPUPhysicalNumber="$($ReadCPUInfo | awk -F ': ' '/physical id/{print $2}' | sort -u | wc -l)" LBench_Result_CPUCoreNumber="$($ReadCPUInfo | awk -F ': ' '/cpu cores/{print $2}' | sort -u)" LBench_Result_CPUThreadNumber="$($ReadCPUInfo | awk -F ': ' '/cores/{print $2}' | wc -l)" LBench_Result_CPUProcessorNumber="$($ReadCPUInfo | awk -F ': ' '/processor/{print $2}' | wc -l)" LBench_Result_CPUSiblingsNumber="$($ReadCPUInfo | awk -F ': ' '/siblings/{print $2}' | sort -u)" LBench_Result_CPUTotalCoreNumber="$($ReadCPUInfo | awk -F ': ' '/physical id/&&/0/{print $2}' | wc -l)" # 虚拟化能力检测 SystemInfo_GetVirtType if [ "${Var_VirtType}" = "dedicated" ] || [ "${Var_VirtType}" = "wsl" ]; then LBench_Result_CPUIsPhysical="1" local VirtCheck="$(cat /proc/cpuinfo | grep -oE 'vmx|svm' | uniq)" if [ "${VirtCheck}" != "" ]; then LBench_Result_CPUVirtualization="1" local VirtualizationType="$(lscpu | awk /Virtualization:/'{print $2}')" LBench_Result_CPUVirtualizationType="${VirtualizationType}" else LBench_Result_CPUVirtualization="0" fi elif [ "${Var_VirtType}" = "kvm" ] || [ "${Var_VirtType}" = "hyperv" ] || [ "${Var_VirtType}" = "microsoft" ] || [ "${Var_VirtType}" = "vmware" ]; then LBench_Result_CPUIsPhysical="0" local VirtCheck="$(cat /proc/cpuinfo | grep -oE 'vmx|svm' | uniq)" if [ "${VirtCheck}" = "vmx" ] || [ "${VirtCheck}" = "svm" ]; then LBench_Result_CPUVirtualization="2" local VirtualizationType="$(lscpu | awk /Virtualization:/'{print $2}')" LBench_Result_CPUVirtualizationType="${VirtualizationType}" else LBench_Result_CPUVirtualization="0" fi else LBench_Result_CPUIsPhysical="0" fi } SystemInfo_GetCPUStat() { local CPUStat_Result="$(top -bn1 | grep Cpu)" # 原始数据 LBench_Result_CPUStat_user="$(Function_ReadCPUStat "${CPUStat_Result}" "us")" LBench_Result_CPUStat_system="$(Function_ReadCPUStat "${CPUStat_Result}" "sy")" LBench_Result_CPUStat_anice="$(Function_ReadCPUStat "${CPUStat_Result}" "ni")" LBench_Result_CPUStat_idle="$(Function_ReadCPUStat "${CPUStat_Result}" "id")" LBench_Result_CPUStat_iowait="$(Function_ReadCPUStat "${CPUStat_Result}" "wa")" LBench_Result_CPUStat_hardint="$(Function_ReadCPUStat "${CPUStat_Result}" "hi")" LBench_Result_CPUStat_softint="$(Function_ReadCPUStat "${CPUStat_Result}" "si")" LBench_Result_CPUStat_steal="$(Function_ReadCPUStat "${CPUStat_Result}" "st")" # 加工后的数据 LBench_Result_CPUStat_UsedAll="$(echo ${LBench_Result_CPUStat_user} ${LBench_Result_CPUStat_system} ${LBench_Result_CPUStat_nice} | awk '{printf "%.1f\n",$1+$2+$3}')" } Function_ReadCPUStat() { if [ "$1" == "" ]; then echo -n "nil" else local result="$(echo $1 | grep -oE "[0-9]{1,2}.[0-9]{1} $2" | awk '{print $1}')" echo $result fi } SystemInfo_GetKernelVersion() { local version="$(uname -r)" LBench_Result_KernelVersion="${version}" } SystemInfo_GetNetworkCCMethod() { local val_cc="$(sysctl -n net.ipv4.tcp_congestion_control)" local val_qdisc="$(sysctl -n net.core.default_qdisc)" LBench_Result_NetworkCCMethod="${val_cc} + ${val_qdisc}" } SystemInfo_GetSystemBit() { local sysarch="$(uname -m)" if [ "${sysarch}" = "unknown" ] || [ "${sysarch}" = "" ]; then local sysarch="$(arch)" fi if [ "${sysarch}" = "x86_64" ]; then # X86平台 64位 LBench_Result_SystemBit_Short="64" LBench_Result_SystemBit_Full="amd64" rm -rf dp wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_amd64 && chmod +x dp rm -rf nf wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.0/nf_linux_amd64 && chmod +x nf rm -rf tubecheck wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_amd64 && chmod +x tubecheck elif [ "${sysarch}" = "i386" ] || [ "${sysarch}" = "i686" ]; then # X86平台 32位 LBench_Result_SystemBit_Short="32" LBench_Result_SystemBit_Full="i386" rm -rf dp wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_386 && chmod +x dp rm -rf nf wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.0/nf_linux_amd64 && chmod +x nf rm -rf tubecheck wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_386 && chmod +x tubecheck elif [ "${sysarch}" = "armv7l" ] || [ "${sysarch}" = "armv8" ] || [ "${sysarch}" = "armv8l" ] || [ "${sysarch}" = "aarch64" ]; then # ARM平台 暂且将32位/64位统一对待 LBench_Result_SystemBit_Short="arm" LBench_Result_SystemBit_Full="arm" rm -rf dp wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_arm && chmod +x dp rm -rf nf wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.1.0/nf_linux_arm64 && chmod +x nf rm -rf tubecheck wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_arm && chmod +x tubecheck else LBench_Result_SystemBit_Short="unknown" LBench_Result_SystemBit_Full="unknown" rm -rf dp wget -O dp https://github.com/sjlleo/VerifyDisneyPlus/releases/download/1.01/dp_1.01_linux_amd64 && chmod +x dp rm -rf nf wget -O nf https://github.com/sjlleo/netflix-verify/releases/download/v3.0/nf_linux_amd64 && chmod +x nf rm -rf tubecheck wget -O tubecheck https://github.com/sjlleo/TubeCheck/releases/download/1.0Beta/tubecheck_1.0beta_linux_amd64 && chmod +x tubecheck fi } SystemInfo_GetVirtType() { if [ -f "/usr/bin/systemd-detect-virt" ]; then Var_VirtType="$(/usr/bin/systemd-detect-virt)" # 虚拟机检测 if [ "${Var_VirtType}" = "qemu" ]; then LBench_Result_VirtType="QEMU" elif [ "${Var_VirtType}" = "kvm" ]; then LBench_Result_VirtType="KVM" elif [ "${Var_VirtType}" = "zvm" ]; then LBench_Result_VirtType="S390 Z/VM" elif [ "${Var_VirtType}" = "vmware" ]; then LBench_Result_VirtType="VMware" elif [ "${Var_VirtType}" = "microsoft" ]; then LBench_Result_VirtType="Microsoft Hyper-V" elif [ "${Var_VirtType}" = "xen" ]; then LBench_Result_VirtType="Xen Hypervisor" elif [ "${Var_VirtType}" = "bochs" ]; then LBench_Result_VirtType="BOCHS" elif [ "${Var_VirtType}" = "uml" ]; then LBench_Result_VirtType="User-mode Linux" elif [ "${Var_VirtType}" = "parallels" ]; then LBench_Result_VirtType="Parallels" elif [ "${Var_VirtType}" = "bhyve" ]; then LBench_Result_VirtType="FreeBSD Hypervisor" # 容器虚拟化检测 elif [ "${Var_VirtType}" = "openvz" ]; then LBench_Result_VirtType="OpenVZ" elif [ "${Var_VirtType}" = "lxc" ]; then LBench_Result_VirtType="LXC" elif [ "${Var_VirtType}" = "lxc-libvirt" ]; then LBench_Result_VirtType="LXC (libvirt)" elif [ "${Var_VirtType}" = "systemd-nspawn" ]; then LBench_Result_VirtType="Systemd nspawn" elif [ "${Var_VirtType}" = "docker" ]; then LBench_Result_VirtType="Docker" elif [ "${Var_VirtType}" = "rkt" ]; then LBench_Result_VirtType="RKT" # 特殊处理 elif [ -c "/dev/lxss" ]; then # 处理WSL虚拟化 Var_VirtType="wsl" LBench_Result_VirtType="Windows Subsystem for Linux (WSL)" # 未匹配到任何结果, 或者非虚拟机 elif [ "${Var_VirtType}" = "none" ]; then Var_VirtType="dedicated" LBench_Result_VirtType="None" local Var_BIOSVendor="$(dmidecode -s bios-vendor)" if [ "${Var_BIOSVendor}" = "SeaBIOS" ]; then Var_VirtType="Unknown" LBench_Result_VirtType="Unknown with SeaBIOS BIOS" else Var_VirtType="dedicated" LBench_Result_VirtType="Dedicated with ${Var_BIOSVendor} BIOS" fi fi elif [ ! -f "/usr/sbin/virt-what" ]; then Var_VirtType="Unknown" LBench_Result_VirtType="[Error: virt-what not found !]" elif [ -f "/.dockerenv" ]; then # 处理Docker虚拟化 Var_VirtType="docker" LBench_Result_VirtType="Docker" elif [ -c "/dev/lxss" ]; then # 处理WSL虚拟化 Var_VirtType="wsl" LBench_Result_VirtType="Windows Subsystem for Linux (WSL)" else # 正常判断流程 Var_VirtType="$(virt-what | xargs)" local Var_VirtTypeCount="$(echo $Var_VirtTypeCount | wc -l)" if [ "${Var_VirtTypeCount}" -gt "1" ]; then # 处理嵌套虚拟化 LBench_Result_VirtType="echo ${Var_VirtType}" Var_VirtType="$(echo ${Var_VirtType} | head -n1)" # 使用检测到的第一种虚拟化继续做判断 elif [ "${Var_VirtTypeCount}" -eq "1" ] && [ "${Var_VirtType}" != "" ]; then # 只有一种虚拟化 LBench_Result_VirtType="${Var_VirtType}" else local Var_BIOSVendor="$(dmidecode -s bios-vendor)" if [ "${Var_BIOSVendor}" = "SeaBIOS" ]; then Var_VirtType="Unknown" LBench_Result_VirtType="Unknown with SeaBIOS BIOS" else Var_VirtType="dedicated" LBench_Result_VirtType="Dedicated with ${Var_BIOSVendor} BIOS" fi fi fi } Function_GenerateResult_SysBench_MemoryTest() { sleep 0.1 if [ -f "${WorkDir}/SysBench/Memory/result.txt" ]; then cp -f ${WorkDir}/SysBench/Memory/result.txt ${WorkDir}/result/05-memorytest.result fi } # 生成结果文件 Function_GenerateResult() { # echo -e "${Msg_Info} Please wait, collecting results ..." mkdir -p /tmp/ >/dev/null 2>&1 mkdir -p ${WorkDir}/result >/dev/null 2>&1 Function_GenerateResult_SysBench_CPUTest >/dev/null Function_GenerateResult_DiskTest >/dev/null Function_GenerateResult_SysBench_MemoryTest >/dev/null # echo -e "${Msg_Info} Generating Report ..." local finalresultfile="${WorkDir}/result/finalresult.txt" sleep 0.2 if [ -f "${WorkDir}/result/01-systeminfo.result" ]; then cat ${WorkDir}/result/01-systeminfo.result >>${WorkDir}/result/finalresult.txt fi sleep 0.2 if [ -f "${WorkDir}/result/04-cputest.result" ]; then cat ${WorkDir}/result/04-cputest.result >>${WorkDir}/result/finalresult.txt fi sleep 0.2 if [ -f "${WorkDir}/result/05-memorytest.result" ]; then cat ${WorkDir}/result/05-memorytest.result >>${WorkDir}/result/finalresult.txt fi sleep 0.2 if [ -f "${WorkDir}/result/06-disktest.result" ]; then cat ${WorkDir}/result/06-disktest.result >>${WorkDir}/result/finalresult.txt fi sleep 0.2 # echo -e "${Msg_Info} Saving local Report ..." cp ${WorkDir}/result/finalresult.txt $HOME/LemonBench.Result.txt sleep 0.1 # echo -e "${Msg_Info} Generating Report URL ..." cat ${WorkDir}/result/finalresult.txt | PasteBin_Upload } Function_GenerateResult_SysBench_CPUTest() { sleep 0.1 if [ -f "${WorkDir}/SysBench/CPU/result.txt" ]; then cp -f ${WorkDir}/SysBench/CPU/result.txt ${WorkDir}/result/04-cputest.result fi } Function_GenerateResult_DiskTest() { sleep 0.1 if [ -f "${WorkDir}/DiskTest/result.txt" ]; then cp -f ${WorkDir}/DiskTest/result.txt ${WorkDir}/result/06-disktest.result fi } Global_Exit_Action() { rm -rf ${WorkDir}/ } PasteBin_Upload() { local uploadresult="$(curl -fsL -X POST \ --url https://paste.ubuntu.com \ --output /dev/null \ --write-out "%{url_effective}\n" \ --data-urlencode "content@${PASTEBIN_CONTENT:-/dev/stdin}" \ --data "poster=${PASTEBIN_POSTER:-LemonBench}" \ --data "expiration=${PASTEBIN_EXPIRATION:-}" \ --data "syntax=${PASTEBIN_SYNTAX:-text}")" if [ "$?" = "0" ]; then # echo -e "${Msg_Success} Report Generate Success!Please save the follwing link:" echo -e "${Msg_Info} 上述测试报告(需登陆查看): ${uploadresult}" else echo -e "${Msg_Warning} Report Generate Failure, But you can still read $HOME/LemonBench.Result.txt to get this result!" fi echo "----------------------------------------------------------------------" } Entrance_SysBench_CPU_Fast() { Check_SysBench >/dev/null 2>&1 SystemInfo_GetCPUInfo Function_SysBench_CPU_Fast # Function_BenchFinish } #speed_test(){ # speedLog="./speedtest.log" # true > $speedLog # speedtest-cli/speedtest -p no -s $1 --accept-license > $speedLog 2>&1 # is_upload=$(cat $speedLog | grep 'Upload') # if [[ ${is_upload} ]]; then # local REDownload=$(cat $speedLog | awk -F ' ' '/Download/{print $3}') # local reupload=$(cat $speedLog | awk -F ' ' '/Upload/{print $3}') # local relatency=$(cat $speedLog | awk -F ' ' '/Latency/{print $2}') # # local nodeID=$1 # local nodeLocation=$2 # local nodeISP=$3 # # strnodeLocation="${nodeLocation}      " # LANG=C # #echo $LANG # # temp=$(echo "${REDownload}" | awk -F ' ' '{print $1}') # if [[ $(awk -v num1=${temp} -v num2=0 'BEGIN{print(num1>num2)?"1":"0"}') -eq 1 ]]; then # # printf "${RED}%-6s${YELLOW}%s%s${GREEN}%-24s${CYAN}%s%-10s${BLUE}%s%-10s${PURPLE}%-8s${PLAIN}\n" "${nodeID}" "${nodeISP}" "|" "${strnodeLocation:0:24}" "↑ " "${reupload}" "↓ " "${REDownload}" "${relatency}" | tee -a $log # printf "\033[0;33m%-18s\033[0;32m%-18s\033[0;31m%-20s\033[0;36m%-12s\033[0m\n" "${strnodeLocation:0:20}" "${reupload}"Mbps "${REDownload}"Mbps "${relatency}"ms # fi # else # local cerror="ERROR" # fi #} speed_test2() { local nodeName="$2" [ -z "$1" ] && ./speedtest-cli/speedtest --progress=no --accept-license --accept-gdpr > ./speedtest-cli/speedtest.log 2>&1 || \ ./speedtest-cli/speedtest --progress=no --server-id=$1 --accept-license --accept-gdpr > ./speedtest-cli/speedtest.log 2>&1 if [ $? -eq 0 ]; then local dl_speed=$(awk '/Download/{print $3" "$4}' ./speedtest-cli/speedtest.log) local up_speed=$(awk '/Upload/{print $3" "$4}' ./speedtest-cli/speedtest.log) local latency=$(awk '/Latency/{print $2" "$3}' ./speedtest-cli/speedtest.log) if [[ -n "${dl_speed}" && -n "${up_speed}" && -n "${latency}" ]]; then echo -e "${nodeName}\t ${up_speed}\t ${dl_speed}\t ${latency}" fi fi } function MediaUnlockTest_Dazn() { echo -n -e " Dazn:\t\t\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} -sS --max-time 10 -X POST -H "Content-Type: application/json" -d '{"LandingPageKey":"generic","Languages":"zh-CN,zh,en","Platform":"web","PlatformAttributes":{},"Manufacturer":"","PromoCode":"","Version":"2"}' "https://startup.core.indazn.com/misl/v5/Startup" 2>&1) if [[ "$tmpresult" == "curl"* ]]; then echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi isAllowed=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'isAllowed' | awk '{print $2}' | cut -f1 -d',') local result=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep '"GeolocatedCountry":' | awk '{print $2}' | cut -f2 -d'"') if [[ "$isAllowed" == "true" ]]; then local CountryCode=$(echo $result | tr [:lower:] [:upper:]) echo -n -e "\r Dazn:\t\t\t\t\t${Font_Green}Yes (Region: ${CountryCode})${Font_Suffix}\n" return elif [[ "$isAllowed" == "false" ]]; then echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}No${Font_Suffix}\n" return else echo -n -e "\r Dazn:\t\t\t\t\t${Font_Red}Unsupport${Font_Suffix}\n" return fi } function MediaUnlockTest_Netflix() { echo -n -e " Netflix:\t\t\t\t->\c" local result1=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -fsL --write-out %{http_code} --output /dev/null --max-time 10 "https://www.netflix.com/title/81215567" 2>&1) if [[ "$result1" == "404" ]]; then echo -n -e "\r Netflix:\t\t\t\t${Font_Yellow}Originals Only${Font_Suffix}\n" return elif [[ "$result1" == "403" ]]; then echo -n -e "\r Netflix:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return elif [[ "$result1" == "200" ]]; then local region=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -fs --max-time 10 --write-out %{redirect_url} --output /dev/null "https://www.netflix.com/title/80018499" | cut -d '/' -f4 | cut -d '-' -f1 | tr [:lower:] [:upper:]) if [[ ! -n "$region" ]]; then region="US" fi echo -n -e "\r Netflix:\t\t\t\t${Font_Green}Yes (Region: ${region})${Font_Suffix}\n" return elif [[ "$result1" == "000" ]]; then echo -n -e "\r Netflix:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi } function MediaUnlockTest_HotStar() { echo -n -e " HotStar:\t\t\t\t->\c" local result=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} ${ssll} -fsL --write-out %{http_code} --output /dev/null --max-time 10 "https://api.hotstar.com/o/v1/page/1557?offset=0&size=20&tao=0&tas=20") if [ "$result" = "000" ]; then echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return elif [ "$result" = "401" ]; then local region=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} ${ssll} -sI "https://www.hotstar.com" | grep 'geo=' | sed 's/.*geo=//' | cut -f1 -d",") local site_region=$(curl $useNIC $xForward -${1} ${ssll} -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://www.hotstar.com" | sed 's@.*com/@@' | tr [:lower:] [:upper:]) if [ -n "$region" ] && [ "$region" = "$site_region" ]; then echo -n -e "\r HotStar:\t\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" return else echo -n -e "\r HotStar:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return fi elif [ "$result" = "475" ]; then echo -n -e "\r HotStar:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return else echo -n -e "\r HotStar:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" fi } function MediaUnlockTest_DisneyPlus() { echo -n -e " Disney+:\t\t\t\t->\c" local PreAssertion=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/devices" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -H "content-type: application/json; charset=UTF-8" -d '{"deviceFamily":"browser","applicationRuntime":"chrome","deviceProfile":"windows","attributes":{}}' 2>&1) if [[ "$PreAssertion" == "curl"* ]] && [[ "$1" == "6" ]]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Red}IPv6 Not Support${Font_Suffix}\n" return elif [[ "$PreAssertion" == "curl"* ]]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi local assertion=$(echo $PreAssertion | python -m json.tool 2>/dev/null | grep assertion | cut -f4 -d'"') local PreDisneyCookie=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '1p') local disneycookie=$(echo $PreDisneyCookie | sed "s/DISNEYASSERTION/${assertion}/g") local TokenContent=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -s --max-time 10 -X POST "https://global.edge.bamgrid.com/token" -H "authorization: Bearer ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "$disneycookie") local isBanned=$(echo $TokenContent | python -m json.tool 2>/dev/null | grep 'forbidden-location') local is403=$(echo $TokenContent | grep '403 ERROR') if [ -n "$isBanned" ] || [ -n "$is403" ]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return fi local fakecontent=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/cookies" | sed -n '8p') local refreshToken=$(echo $TokenContent | python -m json.tool 2>/dev/null | grep 'refresh_token' | awk '{print $2}' | cut -f2 -d'"') local disneycontent=$(echo $fakecontent | sed "s/ILOVEDISNEY/${refreshToken}/g") local tmpresult=$(curl $useNIC $xForward -${1} --user-agent "${UA_Browser}" -X POST -sSL --max-time 10 "https://disney.api.edge.bamgrid.com/graph/v1/device/graphql" -H "authorization: ZGlzbmV5JmJyb3dzZXImMS4wLjA.Cu56AgSfBTDag5NiRA81oLHkDZfu5L3CKadnefEAY84" -d "$disneycontent" 2>&1) local previewcheck=$(curl $useNIC $xForward -${1} -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://disneyplus.com" | grep preview) local isUnabailable=$(echo $previewcheck | grep 'unavailable') local region=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'countryCode' | cut -f4 -d'"') local inSupportedLocation=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'inSupportedLocation' | awk '{print $2}' | cut -f1 -d',') if [[ "$region" == "JP" ]]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Green}Yes (Region: JP)${Font_Suffix}\n" return elif [ -n "$region" ] && [[ "$inSupportedLocation" == "false" ]] && [ -z "$isUnabailable" ]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Yellow}Available For [Disney+ $region] Soon${Font_Suffix}\n" return elif [ -n "$region" ] && [ -n "$isUnavailable" ]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return elif [ -n "$region" ] && [[ "$inSupportedLocation" == "true" ]]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" return elif [ -z "$region" ]; then echo -n -e "\r Disney+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return else echo -n -e "\r Disney+:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" return fi } function MediaUnlockTest_NetflixCDN() { echo -n -e " Netflix Preferred CDN:\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s --max-time 10 "https://api.fast.com/netflix/speedtest/v2?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm&urlCount=1") if [ -z "$tmpresult" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed${Font_Suffix}\n" return elif [ -n "$(echo $tmpresult | grep '>403<')" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (IP Banned By Netflix)${Font_Suffix}\n" return fi local CDNAddr=$(echo $tmpresult | sed 's/.*"url":"//' | cut -f3 -d"/") if [[ "$1" == "6" ]]; then nslookup -q=AAAA $CDNAddr >~/v6_addr.txt ifAAAA=$(cat ~/v6_addr.txt | grep 'AAAA address' | awk '{print $NF}') if [ -z "$ifAAAA" ]; then CDNIP=$(cat ~/v6_addr.txt | grep Address | sed -n '$p' | awk '{print $NF}') else CDNIP=${ifAAAA} fi else CDNIP=$(nslookup $CDNAddr | sed '/^\s*$/d' | awk 'END {print}' | awk '{print $2}') fi if [ -z "$CDNIP" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (CDN IP Not Found)${Font_Suffix}\n" rm -rf ~/v6_addr.txt return fi local CDN_ISP=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -s --max-time 20 "https://api.ip.sb/geoip/$CDNIP" | python -m json.tool 2>/dev/null | grep 'isp' | cut -f4 -d'"') local iata=$(echo $CDNAddr | cut -f3 -d"-" | sed 's/.\{3\}$//' | tr [:lower:] [:upper:]) local isIataFound1=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | grep $iata) local isIataFound2=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | grep $iata) if [ -n "$isIataFound1" ]; then local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | cut -f3 -d"|" | sed -n "/${iata}/=") local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | awk "NR==${lineNo}" | cut -f1 -d"|" | sed -e 's/^[[:space:]]*//') elif [ -z "$isIataFound1" ] && [ -n "$isIataFound2" ]; then local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk '{print $1}' | sed -n "/${iata}/=") local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk "NR==${lineNo}" | cut -f2 -d"," | sed -e 's/^[[:space:]]*//' | tr [:upper:] [:lower:] | sed 's/\b[a-z]/\U&/g') fi if [ -n "$location" ] && [[ "$CDN_ISP" == "Netflix Streaming Services" ]]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Green}$location ${Font_Suffix}\n" rm -rf ~/v6_addr.txt return elif [ -n "$location" ] && [[ "$CDN_ISP" != "Netflix Streaming Services" ]]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Yellow}Associated with [$CDN_ISP] in [$location]${Font_Suffix}\n" rm -rf ~/v6_addr.txt return elif [ -n "$location" ] && [ -z "$CDN_ISP" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}No ISP Info Founded${Font_Suffix}\n" rm -rf ~/v6_addr.txt return fi } function MediaUnlockTest_YouTube_Premium() { echo -n -e " YouTube Premium:\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} --max-time 10 -sSL -H "Accept-Language: en" -b "YSC=BiCUU3-5Gdk; CONSENT=YES+cb.20220301-11-p0.en+FX+700; GPS=1; VISITOR_INFO1_LIVE=4VwPMkB7W5A; PREF=tz=Asia.Shanghai; _gcl_au=1.1.1809531354.1646633279" "https://www.youtube.com/premium" 2>&1) if [[ "$tmpresult" == "curl"* ]]; then echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi local isCN=$(echo $tmpresult | grep 'www.google.cn') if [ -n "$isCN" ]; then echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}No${Font_Suffix} ${Font_Green} (Region: CN)${Font_Suffix} \n" return fi local isNotAvailable=$(echo $tmpresult | grep 'Premium is not available in your country') local region=$(echo $tmpresult | grep "countryCode" | sed 's/.*"countryCode"//' | cut -f2 -d'"') local isAvailable=$(echo $tmpresult | grep 'manageSubscriptionButton') if [ -n "$isNotAvailable" ]; then echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}No${Font_Suffix} \n" return elif [ -n "$isAvailable" ] && [ -n "$region" ]; then echo -n -e "\r YouTube Premium:\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" return elif [ -z "$region" ] && [ -n "$isAvailable" ]; then echo -n -e "\r YouTube Premium:\t\t\t${Font_Green}Yes${Font_Suffix}\n" return else echo -n -e "\r YouTube Premium:\t\t\t${Font_Red}Failed${Font_Suffix}\n" fi } function MediaUnlockTest_PrimeVideo_Region() { echo -n -e " Amazon Prime Video:\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} --user-agent "${UA_Browser}" -s --max-time 10 "https://www.primevideo.com") if [[ "$tmpresult" = "curl"* ]]; then echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi local result=$(echo $tmpresult | grep '"currentTerritory":' | sed 's/.*currentTerritory//' | cut -f3 -d'"' | head -n 1) if [ -n "$result" ]; then echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Green}Yes (Region: $result)${Font_Suffix}\n" return else echo -n -e "\r Amazon Prime Video:\t\t\t${Font_Red}Unsupported${Font_Suffix}\n" return fi } function MediaUnlockTest_TVBAnywhere() { echo -n -e " TVBAnywhere+:\t\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s --max-time 10 "https://uapisfm.tvbanywhere.com.sg/geoip/check/platform/android") if [ -z "$tmpresult" ]; then echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi local result=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep 'allow_in_this_country' | awk '{print $2}' | cut -f1 -d",") if [[ "$result" == "true" ]]; then echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Green}Yes${Font_Suffix}\n" return elif [[ "$result" == "false" ]]; then echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return else echo -n -e "\r TVBAnywhere+:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" fi } function MediaUnlockTest_iQYI_Region() { echo -n -e " iQyi Oversea Region:\t\t\t->\c" curl $useNIC $xForward -${1} ${ssll} -s -I --max-time 10 "https://www.iq.com/" >~/iqiyi if [ $? -eq 1 ]; then echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi result=$(cat ~/iqiyi | grep 'mod=' | awk '{print $2}' | cut -f2 -d'=' | cut -f1 -d';') rm ~/iqiyi >/dev/null 2>&1 if [ -n "$result" ]; then if [[ "$result" == "ntw" ]]; then result=TW echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Green}${result}${Font_Suffix}\n" return else result=$(echo $result | tr [:lower:] [:upper:]) echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Green}${result}${Font_Suffix}\n" return fi else echo -n -e "\r iQyi Oversea Region:\t\t\t${Font_Red}Failed${Font_Suffix}\n" return fi } function MediaUnlockTest_Viu.com() { echo -n -e " Viu.com:\t\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s -o /dev/null -L --max-time 10 -w '%{url_effective}\n' "https://www.viu.com/") if [ "$tmpresult" = "000" ]; then echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return fi result=$(echo $tmpresult | cut -f5 -d"/") if [ -n "$result" ]; then if [[ "$result" == "no-service" ]]; then echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}No${Font_Suffix}\n" return else result=$(echo $result | tr [:lower:] [:upper:]) echo -n -e "\r Viu.com:\t\t\t\t${Font_Green}Yes (Region: ${result})${Font_Suffix}\n" return fi else echo -n -e "\r Viu.com:\t\t\t\t${Font_Red}Failed${Font_Suffix}\n" return fi } function MediaUnlockTest_YouTube_CDN() { echo -n -e " YouTube CDN:\t\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -sS --max-time 10 "https://redirector.googlevideo.com/report_mapping" 2>&1) if [[ "$tmpresult" == "curl"* ]]; then echo -n -e "\r YouTube Region:\t\t\t${Font_Red}Check Failed (Network Connection)${Font_Suffix}\n" return fi local iata=$(echo $tmpresult | grep router | cut -f2 -d'"' | cut -f2 -d"." | sed 's/.\{2\}$//' | tr [:lower:] [:upper:]) local checkfailed=$(echo $tmpresult | grep "=>") if [ -z "$iata" ] && [ -n "$checkfailed" ]; then CDN_ISP=$(echo $checkfailed | awk '{print $3}' | cut -f1 -d"-" | tr [:lower:] [:upper:]) echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Yellow}Associated with [$CDN_ISP]${Font_Suffix}\n" return elif [ -n "$iata" ]; then local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | cut -f3 -d"|" | sed -n "/${iata}/=") local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | awk "NR==${lineNo}" | cut -f1 -d"|" | sed -e 's/^[[:space:]]*//') echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Green}$location${Font_Suffix}\n" return else echo -n -e "\r YouTube CDN:\t\t\t\t${Font_Red}Undetectable${Font_Suffix}\n" return fi } function MediaUnlockTest_NetflixCDN() { echo -n -e " Netflix Preferred CDN:\t\t\t->\c" local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} -s --max-time 10 "https://api.fast.com/netflix/speedtest/v2?https=true&token=YXNkZmFzZGxmbnNkYWZoYXNkZmhrYWxm&urlCount=1") if [ -z "$tmpresult" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed${Font_Suffix}\n" return elif [ -n "$(echo $tmpresult | grep '>403<')" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (IP Banned By Netflix)${Font_Suffix}\n" return fi local CDNAddr=$(echo $tmpresult | sed 's/.*"url":"//' | cut -f3 -d"/") if [[ "$1" == "6" ]]; then nslookup -q=AAAA $CDNAddr >~/v6_addr.txt ifAAAA=$(cat ~/v6_addr.txt | grep 'AAAA address' | awk '{print $NF}') if [ -z "$ifAAAA" ]; then CDNIP=$(cat ~/v6_addr.txt | grep Address | sed -n '$p' | awk '{print $NF}') else CDNIP=${ifAAAA} fi else CDNIP=$(nslookup $CDNAddr | sed '/^\s*$/d' | awk 'END {print}' | awk '{print $2}') fi if [ -z "$CDNIP" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}Failed (CDN IP Not Found)${Font_Suffix}\n" rm -rf ~/v6_addr.txt return fi local CDN_ISP=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -s --max-time 20 "https://api.ip.sb/geoip/$CDNIP" | python -m json.tool 2>/dev/null | grep 'isp' | cut -f4 -d'"') local iata=$(echo $CDNAddr | cut -f3 -d"-" | sed 's/.\{3\}$//' | tr [:lower:] [:upper:]) local isIataFound1=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | grep $iata) local isIataFound2=$(curl -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | grep $iata) if [ -n "$isIataFound1" ]; then local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | cut -f3 -d"|" | sed -n "/${iata}/=") local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode.txt" | awk "NR==${lineNo}" | cut -f1 -d"|" | sed -e 's/^[[:space:]]*//') elif [ -z "$isIataFound1" ] && [ -n "$isIataFound2" ]; then local lineNo=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk '{print $1}' | sed -n "/${iata}/=") local location=$(curl $useNIC $xForward -s --max-time 10 "https://raw.githubusercontent.com/lmc999/RegionRestrictionCheck/main/reference/IATACode2.txt" | awk "NR==${lineNo}" | cut -f2 -d"," | sed -e 's/^[[:space:]]*//' | tr [:upper:] [:lower:] | sed 's/\b[a-z]/\U&/g') fi if [ -n "$location" ] && [[ "$CDN_ISP" == "Netflix Streaming Services" ]]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Green}$location ${Font_Suffix}\n" rm -rf ~/v6_addr.txt return elif [ -n "$location" ] && [[ "$CDN_ISP" != "Netflix Streaming Services" ]]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Yellow}Associated with [$CDN_ISP] in [$location]${Font_Suffix}\n" rm -rf ~/v6_addr.txt return elif [ -n "$location" ] && [ -z "$CDN_ISP" ]; then echo -n -e "\r Netflix Preferred CDN:\t\t\t${Font_Red}No ISP Info Founded${Font_Suffix}\n" rm -rf ~/v6_addr.txt return fi } function MediaUnlockTest_Spotify() { local tmpresult=$(curl $useNIC $xForward -${1} ${ssll} --user-agent "${UA_Browser}" -s --max-time 10 -X POST "https://spclient.wg.spotify.com/signup/public/v1/account" -d "birth_day=11&birth_month=11&birth_year=2000&collect_personal_info=undefined&creation_flow=&creation_point=https%3A%2F%2Fwww.spotify.com%2Fhk-en%2F&displayname=Gay%20Lord&gender=male&iagree=1&key=a1e486e2729f46d6bb368d6b2bcda326&platform=www&referrer=&send-email=0&thirdpartyemail=0&identifier_token=AgE6YTvEzkReHNfJpO114514" -H "Accept-Language: en") local region=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep '"country":' | cut -f4 -d'"') local isLaunched=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep is_country_launched | cut -f1 -d',' | awk '{print $2}') local StatusCode=$(echo $tmpresult | python -m json.tool 2>/dev/null | grep status | cut -f1 -d',' | awk '{print $2}') echo -n -e " Spotify Registration:\t\t\t->\c" if [ "$tmpresult" = "000" ]; then echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" return elif [ "$StatusCode" = "320" ]; then echo -n -e "\r Spotify Registration:\t\t\t${Font_Red}No${Font_Suffix}\n" return elif [ "$StatusCode" = "311" ] && [ "$isLaunched" = "true" ]; then echo -n -e "\r Spotify Registration:\t\t\t${Font_Green}Yes (Region: $region)${Font_Suffix}\n" return fi } function GameTest_Steam() { echo -n -e " Steam Currency:\t\t\t->\c" local result=$(curl $useNIC $xForward --user-agent "${UA_Browser}" -${1} -fsSL --max-time 10 "https://store.steampowered.com/app/761830" 2>&1 | grep priceCurrency | cut -d '"' -f4) if [ ! -n "$result" ]; then echo -n -e "\r Steam Currency:\t\t\t${Font_Red}Failed (Network Connection)${Font_Suffix}\n" else echo -n -e "\r Steam Currency:\t\t\t${Font_Green}${result}${Font_Suffix}\n" fi } trap _exit INT QUIT TERM _red() { echo -e "\033[31m\033[01m$@\033[0m"; } _green() { echo -e "\033[32m\033[01m$@\033[0m"; } _yellow() { echo -e "\033[33m\033[01m$@\033[0m"; } _blue() { echo -e "\033[36m\033[01m$@\033[0m"; } _exists() { local cmd="$1" if eval type type > /dev/null 2>&1; then eval type "$cmd" > /dev/null 2>&1 elif command > /dev/null 2>&1; then command -v "$cmd" > /dev/null 2>&1 else which "$cmd" > /dev/null 2>&1 fi local rt=$? return ${rt} } _exit() { _red "\n检测到退出操作,脚本终止!\n" # clean up rm -fr speedtest.tgz speedtest-cli benchtest_* exit 1 } get_opsy() { [ -f /etc/redhat-release ] && awk '{print $0}' /etc/redhat-release && return [ -f /etc/os-release ] && awk -F'[= "]' '/PRETTY_NAME/{print $3,$4,$5}' /etc/os-release && return [ -f /etc/lsb-release ] && awk -F'[="]+' '/DESCRIPTION/{print $2}' /etc/lsb-release && return } next() { printf "%-70s\n" "-" | sed 's/\s/-/g' } speed() { speed_test2 '' 'speedtest' speed_test2 '21541' '洛杉矶\t' speed_test2 '13623' '新加坡\t' speed_test2 '44988' '日本东京' speed_test2 '16176' '中国香港' speed_test2 '3633' '电信上海' '电信' # speed_test '27594' '电信广东广州5G' '电信' speed_test2 '5396' '电信江苏苏州5G' '电信' speed_test2 '24447' '联通上海' '联通' speed_test2 '26678' '联通广东广州5G' '联通' # speed_test '4870' '联通湖南长沙' '联通' # speed_test '15863' '移动广西南宁' '移动' speed_test2 '16398' '移动贵州贵阳' '移动' speed_test2 '27249' '移动江苏南京5G' '移动' #https://raw.githubusercontent.com/zq/superspeed/master/superspeed.sh } # =============== 磁盘测试 部分 =============== Run_DiskTest_DD() { # 调用方式: Run_DiskTest_DD "测试文件名" "块大小" "写入次数" "测试项目名称" mkdir -p ${WorkDir}/DiskTest/ >/dev/null 2>&1 SystemInfo_GetVirtType mkdir -p /.tmp_LBench/DiskTest >/dev/null 2>&1 mkdir -p ${WorkDir}/data >/dev/null 2>&1 local Var_DiskTestResultFile="${WorkDir}/data/disktest_result" # 将先测试读, 后测试写 echo -n -e " $4\t\t->\c" # 清理缓存, 避免影响测试结果 sync if [ "${Var_VirtType}" != "docker" ] && [ "${Var_VirtType}" != "openvz" ] && [ "${Var_VirtType}" != "lxc" ] && [ "${Var_VirtType}" != "wsl" ]; then echo 3 >/proc/sys/vm/drop_caches fi # 避免磁盘压力过高, 启动测试前暂停1s sleep 1 # 正式写测试 dd if=/dev/zero of=/.tmp_LBench/DiskTest/$1 bs=$2 count=$3 oflag=direct 2>${Var_DiskTestResultFile} local DiskTest_WriteSpeed_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,4} kB\/s|[0-9]{1,4}.[0-9]{1,2} kB\/s|[0-9]{1,4} KB\/s|[0-9]{1,4}.[0-9]{1,2} KB\/s|[0-9]{1,4} MB\/s|[0-9]{1,4}.[0-9]{1,2} MB\/s|[0-9]{1,4} GB\/s|[0-9]{1,4}.[0-9]{1,2} GB\/s|[0-9]{1,4} TB\/s|[0-9]{1,4}.[0-9]{1,2} TB\/s|[0-9]{1,4} kB\/秒|[0-9]{1,4}.[0-9]{1,2} kB\/秒|[0-9]{1,4} KB\/秒|[0-9]{1,4}.[0-9]{1,2} KB\/秒|[0-9]{1,4} MB\/秒|[0-9]{1,4}.[0-9]{1,2} MB\/秒|[0-9]{1,4} GB\/秒|[0-9]{1,4}.[0-9]{1,2} GB\/秒|[0-9]{1,4} TB\/秒|[0-9]{1,4}.[0-9]{1,2} TB\/秒")" DiskTest_WriteSpeed="$(echo "${DiskTest_WriteSpeed_ResultRAW}" | sed "s/秒/s/")" local DiskTest_WriteTime_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} 秒|[0-9]{1,}.[0-9]{1,} 秒")" DiskTest_WriteTime="$(echo ${DiskTest_WriteTime_ResultRAW} | awk '{print $1}')" DiskTest_WriteIOPS="$(echo ${DiskTest_WriteTime} $3 | awk '{printf "%d\n",$2/$1}')" DiskTest_WritePastTime="$(echo ${DiskTest_WriteTime} | awk '{printf "%.2f\n",$1}')" if [ "${DiskTest_WriteIOPS}" -ge "10000" ]; then DiskTest_WriteIOPS="$(echo ${DiskTest_WriteIOPS} 1000 | awk '{printf "%.2f\n",$2/$1}')" echo -n -e "\r $4\t\t${Font_SkyBlue}${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS}K IOPS, ${DiskTest_WritePastTime}s)${Font_Suffix}\t\t->\c" else echo -n -e "\r $4\t\t${Font_SkyBlue}${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS} IOPS, ${DiskTest_WritePastTime}s)${Font_Suffix}\t\t->\c" fi # 清理结果文件, 准备下一次测试 rm -f ${Var_DiskTestResultFile} # 清理缓存, 避免影响测试结果 sync if [ "${Var_VirtType}" != "docker" ] && [ "${Var_VirtType}" != "wsl" ]; then echo 3 >/proc/sys/vm/drop_caches fi sleep 0.5 # 正式读测试 dd if=/.tmp_LBench/DiskTest/$1 of=/dev/null bs=$2 count=$3 iflag=direct 2>${Var_DiskTestResultFile} local DiskTest_ReadSpeed_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,4} kB\/s|[0-9]{1,4}.[0-9]{1,2} kB\/s|[0-9]{1,4} KB\/s|[0-9]{1,4}.[0-9]{1,2} KB\/s|[0-9]{1,4} MB\/s|[0-9]{1,4}.[0-9]{1,2} MB\/s|[0-9]{1,4} GB\/s|[0-9]{1,4}.[0-9]{1,2} GB\/s|[0-9]{1,4} TB\/s|[0-9]{1,4}.[0-9]{1,2} TB\/s|[0-9]{1,4} kB\/秒|[0-9]{1,4}.[0-9]{1,2} kB\/秒|[0-9]{1,4} KB\/秒|[0-9]{1,4}.[0-9]{1,2} KB\/秒|[0-9]{1,4} MB\/秒|[0-9]{1,4}.[0-9]{1,2} MB\/秒|[0-9]{1,4} GB\/秒|[0-9]{1,4}.[0-9]{1,2} GB\/秒|[0-9]{1,4} TB\/秒|[0-9]{1,4}.[0-9]{1,2} TB\/秒")" DiskTest_ReadSpeed="$(echo "${DiskTest_ReadSpeed_ResultRAW}" | sed "s/s/s/")" local DiskTest_ReadTime_ResultRAW="$(cat ${Var_DiskTestResultFile} | grep -oE "[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} s|[0-9]{1,}.[0-9]{1,} 秒|[0-9]{1,}.[0-9]{1,} 秒")" DiskTest_ReadTime="$(echo ${DiskTest_ReadTime_ResultRAW} | awk '{print $1}')" DiskTest_ReadIOPS="$(echo ${DiskTest_ReadTime} $3 | awk '{printf "%d\n",$2/$1}')" DiskTest_ReadPastTime="$(echo ${DiskTest_ReadTime} | awk '{printf "%.2f\n",$1}')" rm -f ${Var_DiskTestResultFile} # 输出结果 echo -n -e "\r $4\t\t${Font_SkyBlue}${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS} IOPS, ${DiskTest_WritePastTime}s)${Font_Suffix}\t\t${Font_SkyBlue}${DiskTest_ReadSpeed} (${DiskTest_ReadIOPS} IOPS, ${DiskTest_ReadPastTime}s)${Font_Suffix}\n" echo -e " $4\t\t${DiskTest_WriteSpeed} (${DiskTest_WriteIOPS} IOPS, ${DiskTest_WritePastTime} s)\t\t${DiskTest_ReadSpeed} (${DiskTest_ReadIOPS} IOPS, ${DiskTest_ReadPastTime} s)" >>${WorkDir}/DiskTest/result.txt rm -rf /.tmp_LBench/DiskTest/ } Function_DiskTest_Fast() { mkdir -p ${WorkDir}/DiskTest/ >/dev/null 2>&1 echo -e " ${Font_Yellow}-> 磁盘IO测试中 (4K Block/1M Block, Direct Mode)${Font_Suffix}\n" echo -e " -> 磁盘IO测试中 (4K Block/1M Block, Direct Mode)\n" >>${WorkDir}/DiskTest/result.txt SystemInfo_GetVirtType SystemInfo_GetOSRelease if [ "${Var_VirtType}" = "docker" ] || [ "${Var_VirtType}" = "wsl" ]; then echo -e " ${Msg_Warning}Due to virt architecture limit, the result may affect by the cache !\n" fi echo -e " ${Font_Yellow}测试操作\t\t写速度\t\t\t\t\t读速度${Font_Suffix}" echo -e " Test Name\t\tWrite Speed\t\t\t\tRead Speed" >>${WorkDir}/DiskTest/result.txt Run_DiskTest_DD "100MB.test" "4k" "25600" "100MB-4K Block" Run_DiskTest_DD "1GB.test" "1M" "1000" "1GB-1M Block" # 执行完成, 标记FLAG LBench_Flag_FinishDiskTestFast="1" sleep 1 } # =============== SysBench - 内存性能 部分 =============== Run_SysBench_Memory() { # 调用方式: Run_SysBench_Memory "线程数" "测试时长(s)" "测试遍数" "测试模式(读/写)" "读写方式(顺序/随机)" "说明" # 变量初始化 mkdir -p ${WorkDir}/SysBench/Memory/ >/dev/null 2>&1 maxtestcount="$3" local count="1" local TestScore="0.00" local TestSpeed="0.00" local TotalScore="0.00" local TotalSpeed="0.00" if [ "$1" -ge "2" ]; then MultiThread_Flag="1" else MultiThread_Flag="0" fi # 运行测试 while [ $count -le $maxtestcount ]; do if [ "$1" -ge "2" ] && [ "$4" = "write" ]; then echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t$count/$maxtestcount \c" else echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t$count/$maxtestcount \c" fi local TestResult="$(sysbench --test=memory --num-threads=$1 --memory-block-size=1M --memory-total-size=102400G --memory-oper=$4 --max-time=$2 --memory-access-mode=$5 run 2>&1)" # 判断是MB还是MiB echo "${TestResult}" | grep -oE "MiB" >/dev/null 2>&1 if [ $? -eq 0 ]; then local MiB_Flag="1" else local MiB_Flag="0" fi local TestScore="$(echo "${TestResult}" | grep -oE "[0-9]{1,}.[0-9]{1,2} ops\/sec|[0-9]{1,}.[0-9]{1,2} per second" | grep -oE "[0-9]{1,}.[0-9]{1,2}")" local TestSpeed="$(echo "${TestResult}" | grep -oE "[0-9]{1,}.[0-9]{1,2} MB\/sec|[0-9]{1,}.[0-9]{1,2} MiB\/sec" | grep -oE "[0-9]{1,}.[0-9]{1,2}")" local TotalScore="$(echo "${TotalScore} ${TestScore}" | awk '{printf "%.2f",$1+$2}')" local TotalSpeed="$(echo "${TotalSpeed} ${TestSpeed}" | awk '{printf "%.2f",$1+$2}')" let count=count+1 local TestResult="" local TestScore="0.00" local TestSpeed="0.00" done ResultScore="$(echo "${TotalScore} ${maxtestcount} 1000" | awk '{printf "%.2f",$1/$2/$3}')" if [ "${MiB_Flag}" = "1" ]; then # MiB to MB ResultSpeed="$(echo "${TotalSpeed} ${maxtestcount} 1048576 1000000" | awk '{printf "%.2f",$1/$2/$3*$4}')" else # 直接输出 ResultSpeed="$(echo "${TotalSpeed} ${maxtestcount}" | awk '{printf "%.2f",$1/$2}')" fi # 1线程的测试结果写入临时变量,方便与后续的多线程变量做对比 if [ "$1" = "1" ] && [ "$4" = "read" ]; then LBench_Result_MemoryReadSpeedSingle="${ResultSpeed}" elif [ "$1" = "1" ] &&[ "$4" = "write" ]; then LBench_Result_MemoryWriteSpeedSingle="${ResultSpeed}" fi if [ "${MultiThread_Flag}" = "1" ]; then # 如果是多线程测试,输出与1线程测试对比的倍率 if [ "$1" -ge "2" ] && [ "$4" = "read" ]; then LBench_Result_MemoryReadSpeedMulti="${ResultSpeed}" local readmultiple="$(echo "${LBench_Result_MemoryReadSpeedMulti} ${LBench_Result_MemoryReadSpeedSingle}" | awk '{printf "%.2f", $1/$2}')" echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${LBench_Result_MemoryReadSpeedMulti}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix} (${readmultiple} x)" elif [ "$1" -ge "2" ] && [ "$4" = "write" ]; then LBench_Result_MemoryWriteSpeedMulti="${ResultSpeed}" local writemultiple="$(echo "${LBench_Result_MemoryWriteSpeedMulti} ${LBench_Result_MemoryWriteSpeedSingle}" | awk '{printf "%.2f", $1/$2}')" echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${LBench_Result_MemoryWriteSpeedMulti}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix} (${writemultiple} x)" fi else if [ "$4" = "read" ]; then echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${ResultSpeed}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix}" elif [ "$4" = "write" ]; then echo -e "\r ${Font_Yellow}$6:${Font_Suffix}\t\t${Font_SkyBlue}${ResultSpeed}${Font_Suffix} ${Font_Yellow}MB/s${Font_Suffix}" fi fi # Fix if [ "$1" -ge "2" ] && [ "$4" = "write" ]; then echo -e " $6:\t${ResultSpeed} MB/s" >>${WorkDir}/SysBench/Memory/result.txt else echo -e " $6:\t\t${ResultSpeed} MB/s" >>${WorkDir}/SysBench/Memory/result.txt fi sleep 1 } Function_SysBench_Memory_Fast() { mkdir -p ${WorkDir}/SysBench/Memory/ >/dev/null 2>&1 echo -e " ${Font_Yellow}-> 内存测试 Test (Fast Mode, 1-Pass @ 5sec)${Font_Suffix}\n" echo -e " -> 内存测试 (Fast Mode, 1-Pass @ 5sec)\n" >>${WorkDir}/SysBench/Memory/result.txt Run_SysBench_Memory "1" "5" "1" "read" "seq" "单线程读测试" Run_SysBench_Memory "1" "5" "1" "write" "seq" "单线程写测试" # 完成FLAG LBench_Flag_FinishSysBenchMemoryFast="1" sleep 1 } Entrance_SysBench_Memory_Fast() { Function_SysBench_Memory_Fast } Entrance_DiskTest_Fast() { Function_DiskTest_Fast # Function_BenchFinish } calc_disk() { local total_size=0 local array=$@ for size in ${array[@]} do [ "${size}" == "0" ] && size_t=0 || size_t=`echo ${size:0:${#size}-1}` [ "`echo ${size:(-1)}`" == "K" ] && size=0 [ "`echo ${size:(-1)}`" == "M" ] && size=$( awk 'BEGIN{printf "%.1f", '$size_t' / 1024}' ) [ "`echo ${size:(-1)}`" == "T" ] && size=$( awk 'BEGIN{printf "%.1f", '$size_t' * 1024}' ) [ "`echo ${size:(-1)}`" == "G" ] && size=${size_t} total_size=$( awk 'BEGIN{printf "%.1f", '$total_size' + '$size'}' ) done echo ${total_size} } check_virt(){ _exists "dmesg" && virtualx="$(dmesg 2>/dev/null)" if _exists "dmidecode"; then sys_manu="$(dmidecode -s system-manufacturer 2>/dev/null)" sys_product="$(dmidecode -s system-product-name 2>/dev/null)" sys_ver="$(dmidecode -s system-version 2>/dev/null)" else sys_manu="" sys_product="" sys_ver="" fi if grep -qa docker /proc/1/cgroup; then virt="Docker" elif grep -qa lxc /proc/1/cgroup; then virt="LXC" elif grep -qa container=lxc /proc/1/environ; then virt="LXC" elif [[ -f /proc/user_beancounters ]]; then virt="OpenVZ" elif [[ "${virtualx}" == *kvm-clock* ]]; then virt="KVM" elif [[ "${cname}" == *KVM* ]]; then virt="KVM" elif [[ "${cname}" == *QEMU* ]]; then virt="KVM" elif [[ "${virtualx}" == *"VMware Virtual Platform"* ]]; then virt="VMware" elif [[ "${virtualx}" == *"Parallels Software International"* ]]; then virt="Parallels" elif [[ "${virtualx}" == *VirtualBox* ]]; then virt="VirtualBox" elif [[ -e /proc/xen ]]; then if grep -q "control_d" "/proc/xen/capabilities" 2>/dev/null; then virt="Xen-Dom0" else virt="Xen-DomU" fi elif [ -f "/sys/hypervisor/type" ] && grep -q "xen" "/sys/hypervisor/type"; then virt="Xen" elif [[ "${sys_manu}" == *"Microsoft Corporation"* ]]; then if [[ "${sys_product}" == *"Virtual Machine"* ]]; then if [[ "${sys_ver}" == *"7.0"* || "${sys_ver}" == *"Hyper-V" ]]; then virt="Hyper-V" else virt="Microsoft Virtual Machine" fi fi else virt="Dedicated" fi } ipv4_info() { local org="$(wget -q -T10 -O- ipinfo.io/org)" local city="$(wget -q -T10 -O- ipinfo.io/city)" local country="$(wget -q -T10 -O- ipinfo.io/country)" local region="$(wget -q -T10 -O- ipinfo.io/region)" if [[ -n "$org" ]]; then echo " ASN组织 : $(_blue "$org")" fi if [[ -n "$city" && -n "$country" ]]; then echo " 位置 : $(_blue "$city / $country")" fi if [[ -n "$region" ]]; then echo " 地区 : $(_yellow "$region")" fi if [[ -z "$org" ]]; then echo " 地区 : $(_red "无法获取ISP信息")" fi } install_speedtest() { if [ ! -e "./speedtest-cli/speedtest" ]; then sys_bit="" local sysarch="$(uname -m)" if [ "${sysarch}" = "unknown" ] || [ "${sysarch}" = "" ]; then local sysarch="$(arch)" fi if [ "${sysarch}" = "x86_64" ]; then sys_bit="x86_64" fi if [ "${sysarch}" = "i386" ] || [ "${sysarch}" = "i686" ]; then sys_bit="i386" fi if [ "${sysarch}" = "armv8" ] || [ "${sysarch}" = "armv8l" ] || [ "${sysarch}" = "aarch64" ] || [ "${sysarch}" = "arm64" ]; then sys_bit="aarch64" fi if [ "${sysarch}" = "armv7" ] || [ "${sysarch}" = "armv7l" ]; then sys_bit="armhf" fi if [ "${sysarch}" = "armv6" ]; then sys_bit="armel" fi [ -z "${sys_bit}" ] && _red "Error: Unsupported system architecture (${sysarch}).\n" && exit 1 url1="https://install.speedtest.net/app/cli/ookla-speedtest-1.1.1-linux-${sys_bit}.tgz" url2="https://dl.lamp.sh/files/ookla-speedtest-1.1.1-linux-${sys_bit}.tgz" wget --no-check-certificate -q -T10 -O speedtest.tgz ${url1} if [ $? -ne 0 ]; then wget --no-check-certificate -q -T10 -O speedtest.tgz ${url2} [ $? -ne 0 ] && _red "Error: Failed to download speedtest-cli.\n" && exit 1 fi mkdir -p speedtest-cli && tar zxf speedtest.tgz -C ./speedtest-cli && chmod +x ./speedtest-cli/speedtest rm -f speedtest.tgz fi } print_intro() { echo "--------------------- A Bench Script By spiritlhl --------------------" echo " 测评频道: https://t.me/vps_reviews " echo "版本:$ver" echo "更新日志:$changeLog" echo "-------------------感谢teddysun和misakabench的开源--------------------" } # Get System information get_system_info() { cname=$( awk -F: '/model name/ {name=$2} END {print name}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) cores=$( awk -F: '/processor/ {core++} END {print core}' /proc/cpuinfo ) freq=$( awk -F'[ :]' '/cpu MHz/ {print $4;exit}' /proc/cpuinfo ) ccache=$( awk -F: '/cache size/ {cache=$2} END {print cache}' /proc/cpuinfo | sed 's/^[ \t]*//;s/[ \t]*$//' ) tram=$( LANG=C; free -m | awk '/Mem/ {print $2}' ) uram=$( LANG=C; free -m | awk '/Mem/ {print $3}' ) swap=$( LANG=C; free -m | awk '/Swap/ {print $2}' ) uswap=$( LANG=C; free -m | awk '/Swap/ {print $3}' ) up=$( awk '{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf("%d days, %d hour %d min\n",a,b,c)}' /proc/uptime ) if _exists "w"; then load=$( LANG=C; w | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' ) elif _exists "uptime"; then load=$( LANG=C; uptime | head -1 | awk -F'load average:' '{print $2}' | sed 's/^[ \t]*//;s/[ \t]*$//' ) fi opsy=$( get_opsy ) arch=$( uname -m ) if _exists "getconf"; then lbit=$( getconf LONG_BIT ) else echo ${arch} | grep -q "64" && lbit="64" || lbit="32" fi kern=$( uname -r ) disk_size1=($( LANG=C df -hPl | grep -wvE '\-|none|tmpfs|devtmpfs|by-uuid|chroot|Filesystem|udev|docker|snapd' | awk '{print $2}' )) disk_size2=($( LANG=C df -hPl | grep -wvE '\-|none|tmpfs|devtmpfs|by-uuid|chroot|Filesystem|udev|docker|snapd' | awk '{print $3}' )) disk_total_size=$( calc_disk "${disk_size1[@]}" ) disk_used_size=$( calc_disk "${disk_size2[@]}" ) tcpctrl=$( sysctl net.ipv4.tcp_congestion_control | awk -F ' ' '{print $3}' ) } # Print System information print_system_info() { if [ -n "$cname" ]; then echo " CPU 型号 : $(_blue "$cname")" else echo " CPU 型号 : $(_blue "无法检测到CPU型号")" fi echo " CPU 核心数 : $(_blue "$cores")" if [ -n "$freq" ]; then echo " CPU 频率 : $(_blue "$freq MHz")" fi if [ -n "$ccache" ]; then echo " CPU 缓存 : $(_blue "$ccache")" fi echo " 硬盘空间 : $(_yellow "$disk_total_size GB") $(_blue "($disk_used_size GB 已用)")" echo " 内存 : $(_yellow "$tram MB") $(_blue "($uram MB 已用)")" echo " Swap : $(_blue "$swap MB ($uswap MB 已用)")" echo " 系统在线时间 : $(_blue "$up")" echo " 负载 : $(_blue "$load")" echo " 系统 : $(_blue "$opsy")" echo " 架构 : $(_blue "$arch ($lbit Bit)")" echo " 内核 : $(_blue "$kern")" echo " TCP加速方式 : $(_yellow "$tcpctrl")" echo " 虚拟化架构 : $(_blue "$virt")" } #print_io_test() { # freespace=$( df -m . | awk 'NR==2 {print $4}' ) # if [ -z "${freespace}" ]; then # freespace=$( df -m . | awk 'NR==3 {print $3}' ) # fi # if [ ${freespace} -gt 1024 ]; then # writemb=2048 # io1=$( io_test ${writemb} ) # echo " 磁盘I/O (第一次) : $(_yellow "$io1")" # io2=$( io_test ${writemb} ) # echo " 磁盘I/O (第二次) : $(_yellow "$io2")" # io3=$( io_test ${writemb} ) # echo " 磁盘I/O (第三次) : $(_yellow "$io3")" # ioraw1=$( echo $io1 | awk 'NR==1 {print $1}' ) # [ "`echo $io1 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw1=$( awk 'BEGIN{print '$ioraw1' * 1024}' ) # ioraw2=$( echo $io2 | awk 'NR==1 {print $1}' ) # [ "`echo $io2 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw2=$( awk 'BEGIN{print '$ioraw2' * 1024}' ) # ioraw3=$( echo $io3 | awk 'NR==1 {print $1}' ) # [ "`echo $io3 | awk 'NR==1 {print $2}'`" == "GB/s" ] && ioraw3=$( awk 'BEGIN{print '$ioraw3' * 1024}' ) # ioall=$( awk 'BEGIN{print '$ioraw1' + '$ioraw2' + '$ioraw3'}' ) # ioavg=$( awk 'BEGIN{printf "%.1f", '$ioall' / 3}' ) # echo " 磁盘I/O (平均结果) : $(_yellow "$ioavg MB/s")" # else # echo " $(_red "Not enough space for I/O Speed test!")" # fi #} print_end_time() { end_time=$(date +%s) time=$(( ${end_time} - ${start_time} )) if [ ${time} -gt 60 ]; then min=$(expr $time / 60) sec=$(expr $time % 60) echo " 总共花费 : ${min} 分 ${sec} 秒" else echo " 总共花费 : ${time} 秒" fi date_time=$(date +%Y-%m-%d" "%H:%M:%S) echo " 时间 : $date_time" } backtrace() { rm -f $TEMP_FILE2 curl https://raw.githubusercontent.com/zhanghanyun/backtrace/main/install.sh -qsSf | sh > $TEMP_FILE2 2>&1 } translate(){ [[ -n "$1" ]] && curl -ksm8 "http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i=${1//[[:space:]]/}" | cut -d \" -f18 2>/dev/null; } check_return() { rm -f $TEMP_FILE IP_4=$(curl -s4m5 https:/ip.gs/json) && WAN_4=$(expr "$IP_4" : '.*ip\":\"\([^"]*\).*') && COUNTRY_4E=$(expr "$IP_4" : '.*country\":\"\([^"]*\).*') && COUNTRY_4=$(translate "$COUNTRY_4E") && ASNORG_4=$(expr "$IP_4" : '.*asn_org\":\"\([^"]*\).*') && PE_4=$(curl -sm5 ping.pe/$WAN_4) && COOKIE_4=$(echo $PE_4 | sed "s/.*document.cookie=\"\([^;]\{1,\}\).*/\1/g") && TYPE_4=$(curl -sm5 --header "cookie: $COOKIE_4" ping.pe/$WAN_4 | grep "id='page-div'" | sed "s/.*\[\(.*\)\].*/\1/g" | sed "s/.*orange'>\([^<]\{1,\}\).*/\1/g" | sed "s/hosting/数据中心/g;s/residential/家庭宽带/g") && _blue " IPv4: $WAN_4\t\t 地区: $COUNTRY_4\t 类型: $TYPE_4\t ASN: $ASNORG_4" >> $TEMP_FILE IP_6=$(curl -s6m5 https:/ip.gs/json) && WAN_6=$(expr "$IP_6" : '.*ip\":\"\([^"]*\).*') && COUNTRY_6E=$(expr "$IP_6" : '.*country\":\"\([^"]*\).*') && COUNTRY_6=$(translate "$COUNTRY_6E") && ASNORG_6=$(expr "$IP_6" : '.*asn_org\":\"\([^"]*\).*') && PE_6=$(curl -sm5 ping6.ping.pe/$WAN_6) && COOKIE_6=$(echo $PE_6 | sed "s/.*document.cookie=\"\([^;]\{1,\}\).*/\1/g") && TYPE_6=$(curl -sm5 --header "cookie: $COOKIE_6" ping6.ping.pe/$WAN_6 | grep "id='page-div'" | sed "s/.*\[\(.*\)\].*/\1/g" | sed "s/.*orange'>\([^<]\{1,\}\).*/\1/g" | sed "s/hosting/数据中心/g;s/residential/家庭宽带/g") && _blue " IPv6: $WAN_6\t 地区: $COUNTRY_6\t 类型: $TYPE_6\t ASN: $ASNORG_6" >> $TEMP_FILE [[ ! -e return.sh ]] && curl -qO https://raw.githubusercontent.com/fscarmen/ecs/main/return.sh chmod +x return.sh >/dev/null 2>&1 _green "依次测试电信,联通,移动经过的地区及线路,核心程序来由: ipip.net ,请知悉!" >> $TEMP_FILE for ((a=0;a<${#test_area[@]};a++)); do _yellow "${test_area[a]} ${test_ip[a]}" >> $TEMP_FILE ./return.sh ${test_ip[a]} >> $TEMP_FILE done } checkroot checkwget checksystem checkpython checkcurl checkspeedtest backtrace check_return SystemInfo_GetSystemBit if [ "${release}" == "centos" ]; then yum update > /dev/null 2>&1 yum -y install python3.7 > /dev/null 2>&1 else apt-get update > /dev/null 2>&1 apt-get -y install python3.7 > /dev/null 2>&1 fi export PYTHONIOENCODING=utf-8 ! _exists "wget" && _red "Error: wget command not found.\n" && exit 1 ! _exists "free" && _red "Error: free command not found.\n" && exit 1 start_time=$(date +%s) get_system_info check_virt clear print_intro print_system_info ipv4_info echo "-------------------CPU测试--感谢lemonbench开源------------------------" Entrance_SysBench_CPU_Fast echo "-------------------内存测试--感谢lemonbench开源-----------------------" Entrance_SysBench_Memory_Fast echo "----------------磁盘IO读写测试--感谢lemonbench开源--------------------" #print_io_test Entrance_DiskTest_Fast next Function_GenerateResult Global_Exit_Action >/dev/null 2>&1 install_speedtest && echo -e "测速点位置\t 上传速度\t 下载速度\t 延迟" speed && rm -fr speedtest-cli echo "--------------------流媒体解锁--感谢sjlleo开源-------------------------" ./tubecheck echo "" ./nf echo "" ./dp echo "解锁油管,奈菲,迪士尼以上面为准,下面这三测的不准" echo -e "\n---------------流媒体解锁--感谢RegionRestrictionCheck开源-------------" echo " 以下为IPV4网络测试" Global_UnlockTest 4 echo " 以下为IPV6网络测试" Global_UnlockTest 6 echo -e "\n-----------------三网回程--感谢zhanghanyun/backtrace开源--------------" cat $TEMP_FILE2 echo -e "\n--------------------回程路由--感谢fscarmen开源------------------------" cat $TEMP_FILE next print_end_time next rm -rf return.sh rm -rf speedtest.tgz* rm -rf wget-log* rm -rf ipip.py* rm -rf dp rm -rf nf rm -rf tubecheck rm -rf ecs.sh rm -rf $TEMP_FILE $TEMP_FILE2