×

关于多拨ADSL端口测速的方法

hqy hqy 发表于2024-12-25 15:38:57 浏览34 评论0

抢沙发发表评论

mportant;">最近因为业务需要,准备着手写个多ADSL端口的shell测速脚本。在客户端测速完成以后,将测速结果上传至服务端,测速结果同时在测速客户端和WEB服务器上同步显示,测速服务器可以查看测速历史记录。考虑了通过如下方式来实现:

1、speedtest,基于speedtest的官方测速节点进行测速。目前的脚本不支持自选节点,默认使用命令自己查到的最近的节点进行测速。但是我们这边测速的节点在兰州电信。多次测速发现测速并不能跑满

#!/bin/bash

# 检测系统和版本
get_os_version() {
    if [[ -e /etc/os-release ]]; then
        source /etc/os-release
        OS=$NAME
        VERSION=$VERSION_ID
    elif type lsb_release >/dev/null 2>&1; then
        OS=$(lsb_release -si)
        VERSION=$(lsb_release -sr)
    elif [[ -e /etc/lsb-release ]]; then
        source /etc/lsb-release
        OS=$DISTRIB_ID
        VERSION=$DISTRIB_RELEASE
    elif [[ -e /etc/debian_version ]]; then
        OS="Debian"
        VERSION=$(cat /etc/debian_version)
    elif [[ -e /etc/centos-release ]]; then
        OS="CentOS"
        VERSION=$(awk '{print $(NF-1)}' /etc/centos-release)
    else
        OS=$(uname -s)
        VERSION=$(uname -r)
    fi
    echo "$OS $VERSION"
}

# 检测并安装 speedtest-cli
install_speedtest_cli() {
    if ! command -v speedtest-cli &>/dev/null; then
        echo "Installing speedtest-cli..."
        if [[ $OS == "CentOS" ]]; then
            sudo curl -o speedtest-cli https://ghproxy.com/https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
            sudo mv speedtest-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/speedtest-cli
			
        elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
            sudo curl -o speedtest-cli https://ghproxy.com/https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
            sudo mv speedtest-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/speedtest-cli
        fi
    fi
}

# 检测并安装 jq
install_jq() {
    if ! command -v jq &>/dev/null; then
        echo "Installing jq..."
        if [[ $OS == "CentOS" ]]; then
            if [[ $VERSION =~ ^7 ]] || [[ $VERSION =~ ^8 ]]; then
                sudo yum -y install epel-release
                sudo yum -y install jq
            fi
        elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
            sudo apt-get update
            sudo apt-get -y install jq
        fi
    fi
}


# 检查并安装 pystun Python 库
install_pystun() {
    if ! command -v pystun &>/dev/null; then
        
        # 安装 pystun 库
		python -m pip install --upgrade --force pip==20.2.4 -i https://pypi.douban.com/simple
		python -m pip install --upgrade --force pip -i https://pypi.douban.com/simple
        pip install pystun
		ln -s /usr/bin/pystun /usr/local/bin/pystun
        echo "pystun library has been installed."
    fi
}

# 获取系统和版本
OS_VERSION=$(get_os_version)
echo "ppp speedtest script By:Fenei"
echo "http://blog.fenei.net"
echo "Operating System and Version: $OS_VERSION"

# 安装 speedtest-cli 和 jq
install_speedtest_cli
install_jq
install_pystun


# 获取当前系统的主机名
hostname=$(hostname)

# 获取当前日期时间
datetime=$(date +"%Y%m%d%H%M%S")

# 设置结果文件名
filename="${hostname}_${datetime}"

# 获取当前系统中的 PPP 端口
ppp_ports=($(ls -d /sys/class/net/ppp* | awk -F/ '{print $NF}'))

# 创建结果目录
mkdir -p testlog

# 清空结果文件
> "testlog/${filename}.csv"

# 输出 CSV 头部
echo "Account,Password,Port,VLAN,IP Addr,Nat_type,ExternalIP,Up Speed(Mbps),Down Speed(Mbps),Test Time" >> "testlog/${filename}.csv"

# 初始化总计变量
total_upload=0
total_download=0


# 遍历每个 PPP 端口
for port in "${ppp_ports[@]}"
do
    (
        # 获取拨号账号
        account=$(grep "USER=" /etc/sysconfig/network-scripts/ifcfg-"$port" | cut -d= -f2)

        # 获取拨号密码
        password=$(grep "\"$account\"" /etc/ppp/pap-secrets | awk -F '"' '{print $4}')

        # 获取拨号网卡的 IP 地址
        ip=$(ip addr show dev "$port" | awk '/inet / {print $2}' | cut -d'/' -f1)

        # 获取 VLAN 编号
        vlan=$(grep "ETH=" /etc/sysconfig/network-scripts/ifcfg-"$port" | awk -F'.' '{if (NF > 1) print $NF; else print 1}')

		# 测试 NAT 类型
        #nat_type=$(pystun --json -i "$ip" | jq -r '.nat_type')
		nat_type=$(pystun -i "$ip" | grep "NAT Type:" | awk -F':' '{print $2}' | awk '{$1=$1};1')
        ExternalIP=$(pystun -i "$ip" | grep "External IP:" | awk '{print $NF}')
        # 运行测速命令并获取上传和下载速度
        result=$(speedtest-cli --source "$ip" --json)
        upload=$(echo "$result" | jq -r '.upload')
        download=$(echo "$result" | jq -r '.download')

        # 获取测速时间(精确到秒)
        speedtest_time=$(date +"%Y-%m-%d %H:%M:%S")

        # 将速度转换为兆比特每秒(Mbps)
        upload=$(awk "BEGIN{printf \"%.2f\", $upload / 1024 / 1024}")
        download=$(awk "BEGIN{printf \"%.2f\", $download / 1024 / 1024}")

        # 输出每个端口的测速结果
        #echo -e "$account\t$password\t$port\t$vlan\t$ip\t$nat_type\t$upload\t$download\t$speedtest_time"

        # 输出到结果文件
        echo "$account,$password,$port,$vlan,$ip,$nat_type,$ExternalIP,$upload,$download,\"$speedtest_time\"" >> "testlog/${filename}.csv"

    ) &
done

# 等待所有线程完成
wait

# 统计上传和下载速度的总和
total_upload=$(awk -F',' '{sum += $8} END {printf "%.2f", sum}' "testlog/${filename}.csv")
total_download=$(awk -F',' '{sum += $9} END {printf "%.2f", sum}' "testlog/${filename}.csv")

# 输出总计行
#echo -e "Total\t\t\t\t\t$total_upload\t$total_download"

# 将总计数据追加到结果文件
echo "Total,,,,,,,$total_upload,$total_download" >> "testlog/${filename}.csv"

# 对齐输出结果
column -s, -t "testlog/${filename}.csv"

# 输出测速结果文件路径
echo "Speed test results saved in the server file: http://spt.fenei.net/2.html?file=${filename}.csv"

# 上传结果文件到服务器
curl -F "file=@testlog/${filename}.csv" http://spt.fenei.net/upload.php

speedtest-go的代码

#!/bin/bash

# 检测系统和版本
get_os_version() {
    if [[ -e /etc/os-release ]]; then
        source /etc/os-release
        OS=$NAME
        VERSION=$VERSION_ID
    elif type lsb_release >/dev/null 2>&1; then
        OS=$(lsb_release -si)
        VERSION=$(lsb_release -sr)
    elif [[ -e /etc/lsb-release ]]; then
        source /etc/lsb-release
        OS=$DISTRIB_ID
        VERSION=$DISTRIB_RELEASE
    elif [[ -e /etc/debian_version ]]; then
        OS="Debian"
        VERSION=$(cat /etc/debian_version)
    elif [[ -e /etc/centos-release ]]; then
        OS="CentOS"
        VERSION=$(awk '{print $(NF-1)}' /etc/centos-release)
    else
        OS=$(uname -s)
        VERSION=$(uname -r)
    fi
    echo "$OS $VERSION"
}

# 检测并安装 speedtest-cli
install_speedtest_cli() {
    if ! command -v speedtest-cli &>/dev/null; then
        echo "Installing speedtest-cli..."
        if [[ $OS == "CentOS" ]]; then
            sudo curl -o speedtest-cli https://ghproxy.com/https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
            sudo mv speedtest-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/speedtest-cli
			
        elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
            sudo curl -o speedtest-cli https://ghproxy.com/https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
            sudo mv speedtest-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/speedtest-cli
        fi
    fi
}

# 检测并安装 speedtest-cli
install_speedtest_go() {
    if ! command -v speedtest-go &>/dev/null; then
        echo "Installing speedtest-go..."
		curl -o speedtest-go.tar.gz https://ghproxy.com/https://github.com/showwin/speedtest-go/releases/download/v1.6.3/speedtest-go_1.6.3_Linux_x86_64.tar.gz
		tar xf speedtest-go.tar.gz
		mv speedtest-go /usr/local/bin/
		chmod +x /usr/local/bin/speedtest-go
		rm speedtest-go.tar.gz
        echo "speedtest-go 安装完成!"
    else
        echo "speedtest-go 已经安装过了。"
    fi
}

# 检测并安装 jq
install_jq() {
    if ! command -v jq &>/dev/null; then
        echo "Installing jq..."
        if [[ $OS == "CentOS" ]]; then
            if [[ $VERSION =~ ^7 ]] || [[ $VERSION =~ ^8 ]]; then
                sudo yum -y install epel-release
                sudo yum -y install jq
            fi
        elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
            sudo apt-get update
            sudo apt-get -y install jq
        fi
    fi
}


# 检查并安装 pystun Python 库
install_pystun() {
    if ! command -v pystun &>/dev/null; then
        
        # 安装 pystun 库
		python -m pip install --upgrade --force pip==20.2.4 -i https://pypi.douban.com/simple
		python -m pip install --upgrade --force pip -i https://pypi.douban.com/simple
        pip install pystun
		ln -s /usr/bin/pystun /usr/local/bin/pystun
        echo "pystun library has been installed."
    fi
}

# 获取系统和版本
OS_VERSION=$(get_os_version)
echo "ppp speedtest script By:Fenei"
echo "http://blog.fenei.net"
echo "Operating System and Version: $OS_VERSION"

# 安装 speedtest-cli 和 jq
install_speedtest_cli
install_speedtest_go
install_jq
install_pystun


# 获取当前系统的主机名
hostname=$(hostname)

# 获取当前日期时间
datetime=$(date +"%Y%m%d%H%M%S")

# 设置结果文件名
filename="${hostname}_${datetime}"

# 获取当前系统中的 PPP 端口
ppp_ports=($(ls -d /sys/class/net/ppp* | awk -F/ '{print $NF}'))

# 创建结果目录
mkdir -p testlog

# 清空结果文件
> "testlog/${filename}.csv"

# 输出 CSV 头部
echo "Account,Password,Port,VLAN,IP Addr,Nat_type,ExternalIP,Up Speed(Mbps),Down Speed(Mbps),Test Time" >> "testlog/${filename}.csv"

# 初始化总计变量
total_upload=0
total_download=0


# 遍历每个 PPP 端口
for port in "${ppp_ports[@]}"
do
    (
        # 获取拨号账号
        account=$(grep "USER=" /etc/sysconfig/network-scripts/ifcfg-"$port" | cut -d= -f2)

        # 获取拨号密码
        password=$(grep "\"$account\"" /etc/ppp/pap-secrets | awk -F '"' '{print $4}')

        # 获取拨号网卡的 IP 地址
        ip=$(ip addr show dev "$port" | awk '/inet / {print $2}' | cut -d'/' -f1)

        # 获取 VLAN 编号
        vlan=$(grep "ETH=" /etc/sysconfig/network-scripts/ifcfg-"$port" | awk -F'.' '{if (NF > 1) print $NF; else print 1}')

		# 测试 NAT 类型
        #nat_type=$(pystun --json -i "$ip" | jq -r '.nat_type')
		nat_type=$(pystun -H stun.miwifi.com  -i "$ip" | grep "NAT Type:" | awk -F':' '{print $2}' | awk '{$1=$1};1')
        ExternalIP=$(pystun -H stun.miwifi.com -i "$ip" | grep "External IP:" | awk '{print $NF}')
        # 运行测速命令并获取上传和下载速度
        echo "speedtest-go --custom-url=http://113.143.100.145:8082/backend/upload.php  --source=$port --json"
        result=$(speedtest-go --custom-url=http://113.143.100.145:8082/backend/upload.php  --source=$port --json)
        upload=$(echo "$result" | jq -r '.servers[0].ul_speed')
        download=$(echo "$result" | jq -r '.servers[0].dl_speed')

        # 获取测速时间(精确到秒)
        speedtest_time=$(date +"%Y-%m-%d %H:%M:%S")

        # 将速度转换为兆比特每秒(Mbps)
        #upload=$(awk "BEGIN{printf \"%.2f\", $upload / 1024 / 1024}")
        #download=$(awk "BEGIN{printf \"%.2f\", $download / 1024 / 1024}")

        # 输出每个端口的测速结果
        #echo -e "$account\t$password\t$port\t$vlan\t$ip\t$nat_type\t$upload\t$download\t$speedtest_time"

        # 输出到结果文件
        echo "$account,$password,$port,$vlan,$ip,$nat_type,$ExternalIP,$upload,$download,\"$speedtest_time\"" >> "testlog/${filename}.csv"

    ) &
done

# 等待所有线程完成
wait

# 统计上传和下载速度的总和
total_upload=$(awk -F',' '{sum += $8} END {printf "%.2f", sum}' "testlog/${filename}.csv")
total_download=$(awk -F',' '{sum += $9} END {printf "%.2f", sum}' "testlog/${filename}.csv")

# 输出总计行
#echo -e "Total\t\t\t\t\t$total_upload\t$total_download"

# 将总计数据追加到结果文件
echo "Total,,,,,,,$total_upload,$total_download" >> "testlog/${filename}.csv"

# 对齐输出结果
column -s, -t "testlog/${filename}.csv"

# 输出测速结果文件路径
echo "Speed test results saved in the server file: http://spt.fenei.net/2.html?file=${filename}.csv"

# 上传结果文件到服务器
curl -F "file=@testlog/${filename}.csv" http://spt.fenei.net/upload.php
iperf3的代码,服务端docker命令为docker container run --rm --init --net=host --name iperf -e COUNT=2000 cseelye/iperf-multi
#!/bin/bash

# 检查iperf3是否已安装
check_iperf3() {
  if ! command -v iperf3 &>/dev/null; then
    echo "iperf3 is not installed. Please install iperf3 before running this script."
    exit 1
  fi
}

# 检查jq是否已安装
check_jq() {
  if ! command -v jq &>/dev/null; then
    echo "jq is not installed. Please install jq before running this script."
    exit 1
  fi
}

# 检查pystun是否已安装
check_pystun() {
  if ! command -v pystun &>/dev/null; then
    echo "pystun is not installed. Please install pystun before running this script."
    exit 1
  fi
}

# 测试iperf服务器可用性
test_iperf_servers() {
  local servers=("iperf1.fenei.net" "iperf2.fenei.net")
  local available_servers=()
  
  for server in "${servers[@]}"; do
    if iperf3 -c "$server" -p 5201 -P 1 -t 1 -J &>/dev/null; then
      available_servers+=("$server")
    fi
  done
  
  echo "${available_servers[@]}"
}

# 获取NAT类型和外部IP
get_nat_type_and_external_ip() {
  local ip=$1
  local nat_type
  local external_ip
  
  nat_type=$(pystun -i "$ip" | grep "NAT Type:" | awk -F':' '{print $2}' | awk '{$1=$1};1')
  external_ip=$(pystun -i "$ip" | grep "External IP:" | awk '{print $NF}')
  
  echo "$nat_type,$external_ip"
}

# 测速函数
run_speed_test() {
  local account=$1
  local password=$2
  local port=$3
  local vlan=$4
  local ip_addr=$5
  local server=$6
  local server_port=$7
  
  echo "Running speed test for $account on $port"
  
  # 获取NAT类型和外部IP
  local nat_type_and_external_ip=$(get_nat_type_and_external_ip "$ip_addr")
  local nat_type=${nat_type_and_external_ip%,*}
  local external_ip=${nat_type_and_external_ip#*,}
  
  # 运行iperf3测速
  local iperf_result_up=$(iperf3 -c "$server" -p $((5200+(RANDOM%2000))) -B $ip_addr -t 1 -P 5  -f m -J)
  local iperf_result_down=$(iperf3 -c "$server" -p $((5200+(RANDOM%2000))) -B $ip_addr -t 1 -P 5  -R -f m -J)
  local up_speed=$(echo "$iperf_result_up" | jq -r '.end.sum_sent.bits_per_second' | awk '{printf "%.2f", $1 / 1000000}')
  local down_speed=$(echo "$iperf_result_down" | jq -r '.end.sum_received.bits_per_second' | awk '{printf "%.2f", $1 / 1000000}')
  echo "iperf3 -c "$server" -p $((5200+(RANDOM%30))) -B $ip_addr -f m -J"
  # 将测速结果追加到结果文件
  echo "$account,$password,$port,$vlan,$ip_addr,$nat_type,$external_ip,$up_speed,$down_speed,$datetime" >> "testlog/${filename}.csv"
  
  echo "Speed test for $account on $port completed"
}

# 获取当前系统中的PPP端口
get_ppp_ports() {
  local ppp_ports=($(ls -d /sys/class/net/ppp* | awk -F/ '{print $NF}'))
  echo "${ppp_ports[@]}"
}

# 主函数
main() {
  # 检查依赖
  check_iperf3
  check_jq
  check_pystun
  
  # 创建结果文件夹
  mkdir -p testlog
  # 清空结果文件
  > "testlog/${filename}.csv"

  # 输出 CSV 头部
  echo "Account,Password,Port,VLAN,IP Addr,Nat_type,ExternalIP,Up Speed(Mbps),Down Speed(Mbps),Test Time" >> "testlog/${filename}.csv"
  
  # 获取当前系统的主机名
  local hostname=$(hostname)

  # 获取当前日期时间
  local datetime=$(date +"%Y%m%d%H%M%S")

  # 设置结果文件名
  local filename="${hostname}_${datetime}"

  
  # 获取可用的iperf服务器
  local available_servers=($(test_iperf_servers))
  
  if [ ${#available_servers[@]} -eq 0 ]; then
    echo "No available iperf servers found."
    exit 1
  fi
  
  # 获取PPP端口列表
  local ppp_ports=($(get_ppp_ports))
  
  if [ ${#ppp_ports[@]} -eq 0 ]; then
    echo "No PPP ports found."
    exit 1
  fi
  
  local server_index=0
  
  # 遍历PPP端口,运行测速
  for port in "${ppp_ports[@]}"; do
    # 获取拨号账号
    local account=$(grep "USER=" /etc/sysconfig/network-scripts/ifcfg-"$port" | cut -d= -f2)
    
    # 获取拨号密码
    local password=$(grep "\"$account\"" /etc/ppp/pap-secrets | awk -F '"' '{print $4}')
    
    # 获取拨号网卡的IP地址
    local ip=$(ip addr show dev "$port" | awk '/inet / {print $2}' | cut -d'/' -f1)
    
    # 获取VLAN编号
    local vlan=$(grep "ETH=" /etc/sysconfig/network-scripts/ifcfg-"$port" | awk -F'.' '{if (NF > 1) print $NF; else print 1}')
    
    # 获取当前服务器和端口
    local server=${available_servers[$server_index]}
    local server_port=$((5201 + server_index))
    
    # 多线程运行测速
    run_speed_test "$account" "$password" "$port" "$vlan" "$ip" "$server" "$server_port" &
    
    # 更新服务器索引
    server_index=$(( (server_index + 1) % ${#available_servers[@]} ))
	echo $server_index
  done
  
  # 等待所有测速任务完成
  wait
	# 统计上传和下载速度的总和
	total_upload=$(awk -F',' '{sum += $8} END {printf "%.2f", sum}' "testlog/${filename}.csv")
	total_download=$(awk -F',' '{sum += $9} END {printf "%.2f", sum}' "testlog/${filename}.csv")

	# 输出总计行
	#echo -e "Total\t\t\t\t\t$total_upload\t$total_download"

	# 将总计数据追加到结果文件
	echo "Total,,,,,,,$total_upload,$total_download" >> "testlog/${filename}.csv"

	# 对齐输出结果
	column -s, -t "testlog/${filename}.csv"

	# 输出测速结果文件路径
	echo "Speed test results saved in the server file: http://spt.fenei.net/2.html?file=${filename}.csv"

	# 上传结果文件到服务器
	curl -F "file=@testlog/${filename}.csv" http://spt.fenei.net/upload.php

}

# 运行主函数
main

基于librespeed-cli,此测速工具支持自建测速节点。

#!/bin/bash

# 检测系统和版本
get_os_version() {
    if [[ -e /etc/os-release ]]; then
        source /etc/os-release
        OS=$NAME
        VERSION=$VERSION_ID
    elif type lsb_release >/dev/null 2>&1; then
        OS=$(lsb_release -si)
        VERSION=$(lsb_release -sr)
    elif [[ -e /etc/lsb-release ]]; then
        source /etc/lsb-release
        OS=$DISTRIB_ID
        VERSION=$DISTRIB_RELEASE
    elif [[ -e /etc/debian_version ]]; then
        OS="Debian"
        VERSION=$(cat /etc/debian_version)
    elif [[ -e /etc/centos-release ]]; then
        OS="CentOS"
        VERSION=$(awk '{print $(NF-1)}' /etc/centos-release)
    else
        OS=$(uname -s)
        VERSION=$(uname -r)
    fi
    echo "$OS $VERSION"
}

# 检测并安装 speedtest-cli
install_speedtest_cli() {
    if ! command -v speedtest-cli &>/dev/null; then
        echo "Installing speedtest-cli..."
        if [[ $OS == "CentOS" ]]; then
            sudo curl -o speedtest-cli https://ghproxy.com/https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
            sudo mv speedtest-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/speedtest-cli
			
        elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
            sudo curl -o speedtest-cli https://ghproxy.com/https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
            sudo mv speedtest-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/speedtest-cli
        fi
    fi
}

# 检测并安装 librespeed-cli

install_librespeed-cli() {
    if ! command -v librespeed-cli &>/dev/null; then
        echo "Installing librespeed-cli..."
            sudo curl -o librespeed-cli.tar.gz https://ghproxy.com/https://github.com/librespeed/speedtest-cli/releases/download/v1.0.10/librespeed-cli_1.0.10_linux_amd64.tar.gz
            sudo tar xf librespeed-cli.tar.gz
			sudo mv librespeed-cli /usr/local/bin/
            sudo chmod +x /usr/local/bin/librespeed-cli
    fi
}

# 检测并安装 jq
install_jq() {
    if ! command -v jq &>/dev/null; then
        echo "Installing jq..."
        if [[ $OS == "CentOS" ]]; then
            if [[ $VERSION =~ ^7 ]] || [[ $VERSION =~ ^8 ]]; then
                sudo yum -y install epel-release
                sudo yum -y install jq
            fi
        elif [[ $OS == "Ubuntu" ]] || [[ $OS == "Debian" ]]; then
            sudo apt-get update
            sudo apt-get -y install jq
        fi
    fi
}


# 检查并安装 pystun Python 库
install_pystun() {
    if ! command -v pystun &>/dev/null; then
        
        # 安装 pystun 库
		python -m pip install --upgrade --force pip==20.2.4 -i https://pypi.douban.com/simple
		python -m pip install --upgrade --force pip -i https://pypi.douban.com/simple
        pip install pystun
		ln -s /usr/bin/pystun /usr/local/bin/pystun
        echo "pystun library has been installed."
    fi
}

# 获取系统和版本
OS_VERSION=$(get_os_version)
echo "ppp speedtest script By:Fenei"
echo "http://blog.fenei.net"
echo "Operating System and Version: $OS_VERSION"

# 安装 speedtest-cli 和 jq
install_speedtest_cli
install_librespeed-cli
install_jq
install_pystun


# 获取当前系统的主机名
hostname=$(hostname)

# 获取当前日期时间
datetime=$(date +"%Y%m%d%H%M%S")

# 设置结果文件名
filename="${hostname}_${datetime}"

# 获取当前系统中的 PPP 端口
ppp_ports=($(ls -d /sys/class/net/ppp* | awk -F/ '{print $NF}'))

# 创建结果目录
mkdir -p testlog

# 清空结果文件
> "testlog/${filename}.csv"

# 输出 CSV 头部
echo "Account,Password,Port,VLAN,IP Addr,Nat_type,ExternalIP,Up Speed(Mbps),Down Speed(Mbps),Test Time" >> "testlog/${filename}.csv"

# 初始化总计变量
total_upload=0
total_download=0


# 遍历每个 PPP 端口
for port in "${ppp_ports[@]}"
do
    (
        # 获取拨号账号
        account=$(grep "USER=" /etc/sysconfig/network-scripts/ifcfg-"$port" | cut -d= -f2)

        # 获取拨号密码
        password=$(grep "\"$account\"" /etc/ppp/pap-secrets | awk -F '"' '{print $4}')

        # 获取拨号网卡的 IP 地址
        ip=$(ip addr show dev "$port" | awk '/inet / {print $2}' | cut -d'/' -f1)

        # 获取 VLAN 编号
        vlan=$(grep "ETH=" /etc/sysconfig/network-scripts/ifcfg-"$port" | awk -F'.' '{if (NF > 1) print $NF; else print 1}')

		# 测试 NAT 类型
        #nat_type=$(pystun --json -i "$ip" | jq -r '.nat_type')
		#nat_type=$(pystun -i "$ip" | grep "NAT Type:" | awk -F':' '{print $2}' | awk '{$1=$1};1')
        #ExternalIP=$(pystun -i "$ip" | grep "External IP:" | awk '{print $NF}')
        # 运行测速命令并获取上传和下载速度
        result=$(librespeed-cli -4 --source "$ip" --local-json /root/1.json --json)
        upload=$(echo $result | jq -r '.[0].upload')
        download=$(echo $result | jq -r '.[0].download')

        # 获取测速时间(精确到秒)
        speedtest_time=$(date +"%Y-%m-%d %H:%M:%S")

        # 将速度转换为兆比特每秒(Mbps)
        #upload=$(awk "BEGIN{printf \"%.2f\", $upload / 1024 / 1024}")
        #download=$(awk "BEGIN{printf \"%.2f\", $download / 1024 / 1024}")

        # 输出每个端口的测速结果
        #echo -e "$account\t$password\t$port\t$vlan\t$ip\t$nat_type\t$upload\t$download\t$speedtest_time"

        # 输出到结果文件
        echo "$account,$password,$port,$vlan,$ip,$nat_type,$ExternalIP,$upload,$download,\"$speedtest_time\"" >> "testlog/${filename}.csv"

    ) &
done

# 等待所有线程完成
wait

# 统计上传和下载速度的总和
total_upload=$(awk -F',' '{sum += $8} END {printf "%.2f", sum}' "testlog/${filename}.csv")
total_download=$(awk -F',' '{sum += $9} END {printf "%.2f", sum}' "testlog/${filename}.csv")

# 输出总计行
#echo -e "Total\t\t\t\t\t$total_upload\t$total_download"

# 将总计数据追加到结果文件
echo "Total,,,,,,,$total_upload,$total_download" >> "testlog/${filename}.csv"

# 对齐输出结果
column -s, -t "testlog/${filename}.csv"

# 输出测速结果文件路径
echo "Speed test results saved in the server file: http://spt.fenei.net/2.html?file=${filename}.csv"

# 上传结果文件到服务器
curl -F "file=@testlog/${filename}.csv" http://spt.fenei.net/upload.php

对应的librespeed服务端docker脚本
---
version: "3"
services:
  librespeed_8080:
    image: adolfintel/speedtest
    container_name: librespeed_8080
    ports:
      - 8080:80
    environment:
      - MODE=frontend
      - TELEMETRY=true
      - PASSWORD=admin@123
      - ENABLE_ID_OBFUSCATION=true
    volumes:
      - /data/lrs/frontend/servers.json:/servers.json
      #- /data/lrs/frontend/servers.json:/var/www/html/servers.json
    restart: unless-stopped

  librespeed_8081:
    image: adolfintel/speedtest
    container_name: librespeed_8081
    ports:
      - 8081:80
    environment:
      - MODE=backend
      - TELEMETRY=true
      - PASSWORD=admin@123
    restart: unless-stopped

  librespeed_8082:
    image: adolfintel/speedtest
    container_name: librespeed_8082
    ports:
      - 8082:80
    environment:
      - MODE=backend
      - TELEMETRY=true
      - PASSWORD=admin@123
    restart: unless-stopped

  librespeed_8083:
    image: adolfintel/speedtest
    container_name: librespeed_8083
    ports:
      - 8083:80
    environment:
      - MODE=backend
      - TELEMETRY=true
      - PASSWORD=admin@123
    restart: unless-stopped
  librespeed_8084:
    image: adolfintel/speedtest
    container_name: librespeed_8084
    ports:
      - 8084:80
    environment:
      - MODE=backend
      - TELEMETRY=true
      - PASSWORD=admin@123
    restart: unless-stopped
  librespeed_8085:
    image: adolfintel/speedtest
    container_name: librespeed_8085
    ports:
      - 8085:80
    environment:
      - MODE=backend
      - TELEMETRY=true
      - PASSWORD=admin@123
    restart: unless-stopped

  librespeed_8086:
    image: badapple9/speedtest-x
    container_name: librespeed_8086
    ports:
      - 8086:80
    environment:
      - MAX_LOG_COUNT=100
      - IP_SERVICE=ip.sb
      - SAME_IP_MULTI_LOGS=true
    restart: unless-stopped

WEB服务端展现如下,可对主机名测速时间段进行筛选。并查看历史测速详情。


打赏

本文链接:https://www.kinber.cn/post/4348.html 转载需授权!

分享到:


推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

 您阅读本篇文章共花了: 

群贤毕至

访客