From 285edd27d6ceb9524611ae447bb941da0439cdca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=94=AC=E5=93=A5=E4=BE=83=E4=BE=83=E4=BE=83ygkkk?= Date: Tue, 21 Mar 2023 00:56:35 +0000 Subject: [PATCH] Add new file --- point/1.sh | 530 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 530 insertions(+) create mode 100644 point/1.sh diff --git a/point/1.sh b/point/1.sh new file mode 100644 index 0000000..20e8a1e --- /dev/null +++ b/point/1.sh @@ -0,0 +1,530 @@ +#!/bin/bash +# better-cloudflare-ip + +function bettercloudflareip(){ +read -p "请设置期望的带宽大小(默认最小1,单位 Mbps):" bandwidth +read -p "请设置RTT测试进程数(默认10,最大50):" tasknum +if [ -z "$bandwidth" ] +then + bandwidth=1 +fi +if [ $bandwidth -eq 0 ] +then + bandwidth=1 +fi +if [ -z "$tasknum" ] +then + tasknum=10 +fi +if [ $tasknum -eq 0 ] +then + echo "进程数不能为0,自动设置为默认值" + tasknum=10 +fi +if [ $tasknum -gt 50 ] +then + echo "超过最大进程限制,自动设置为最大值" + tasknum=50 +fi +speed=$[$bandwidth*128*1024] +starttime=$(date +%s) +cloudflaretest +realbandwidth=$[$max/128] +endtime=$(date +%s) +echo "从服务器获取详细信息" +unset temp +if [ "$ips" == "ipv4" ] +then + if [ $tls == 1 ] + then + temp=($(curl --resolve $domain:443:$anycast --retry 1 -s https://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) + else + temp=($(curl -x $anycast:80 --retry 1 -s http://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) + fi +else + if [ $tls == 1 ] + then + temp=($(curl --resolve $domain:443:$anycast --retry 1 -s https://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) + else + temp=($(curl -x [$anycast]:80 --retry 1 -s http://$domain/cdn-cgi/trace --connect-timeout 2 --max-time 3)) + fi +fi +if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | grep colo= | wc -l) == 0 ] +then + publicip=获取超时 + colo=获取超时 +else + publicip=$(echo ${temp[@]} | sed -e 's/ /\n/g' | grep ip= | cut -f 2- -d'=') + colo=$(grep -w "($(echo ${temp[@]} | sed -e 's/ /\n/g' | grep colo= | cut -f 2- -d'='))" colo.txt | awk -F"-" '{print $1}') +fi +clear +echo "优选IP $anycast" +echo "公网IP $publicip" +if [ $tls == 1 ] +then + echo "支持端口 443 2053 2083 2087 2096 8443" +else + echo "支持端口 80 8080 8880 2052 2082 2086 2095" +fi +echo "设置带宽 $bandwidth Mbps" +echo "实测带宽 $realbandwidth Mbps" +echo "峰值速度 $max kB/s" +echo "往返延迟 $avgms 毫秒" +echo "数据中心 $colo" +echo "总计用时 $[$endtime-$starttime] 秒" +} + +function rtthttps(){ +avgms=0 +n=1 +for ip in `cat rtt/$1.txt` +do + while true + do + if [ $n -le 3 ] + then + rsp=$(curl --resolve $domain:443:$ip https://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code}) + if [ $(echo $rsp | awk -F_ '{print $2}') != 200 ] + then + avgms=0 + n=1 + break + else + avgms=$[$(echo $rsp | awk -F_ '{printf ("%d\n",$1*1000000)}')+$avgms] + n=$[$n+1] + fi + else + avgms=$[$avgms/3000] + if [ $avgms -lt 10 ] + then + echo 00$avgms $ip >> rtt/$1.log + elif [ $avgms -ge 10 ] && [ $avgms -lt 100 ] + then + echo 0$avgms $ip >> rtt/$1.log + else + echo $avgms $ip >> rtt/$1.log + fi + avgms=0 + n=1 + break + fi + done +done +rm -rf rtt/$1.txt +} + +function rtthttp(){ +avgms=0 +n=1 +for ip in `cat rtt/$1.txt` +do + while true + do + if [ $n -le 3 ] + then + if [ $(echo $ip | grep : | wc -l) == 0 ] + then + rsp=$(curl -x $ip:80 http://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code}) + else + rsp=$(curl -x [$ip]:80 http://$domain/cdn-cgi/trace -o /dev/null -s --connect-timeout 1 --max-time 3 -w %{time_connect}_%{http_code}) + fi + if [ $(echo $rsp | awk -F_ '{print $2}') != 200 ] + then + avgms=0 + n=1 + break + else + avgms=$[$(echo $rsp | awk -F_ '{printf ("%d\n",$1*1000000)}')+$avgms] + n=$[$n+1] + fi + else + avgms=$[$avgms/3000] + if [ $avgms -lt 10 ] + then + echo 00$avgms $ip >> rtt/$1.log + elif [ $avgms -ge 10 ] && [ $avgms -lt 100 ] + then + echo 0$avgms $ip >> rtt/$1.log + else + echo $avgms $ip >> rtt/$1.log + fi + avgms=0 + n=1 + break + fi + done +done +rm -rf rtt/$1.txt +} + +function speedtesthttps(){ +rm -rf log.txt speed.txt +curl --resolve $domain:443:$1 https://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 > log.txt 2>&1 +cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep -v 'k\|M' >> speed.txt +for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep k | sed 's/k//g'` +do + k=$i + k=$[$k*1024] + echo $k >> speed.txt +done +for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep M | sed 's/M//g'` +do + i=$(echo | awk '{print '$i'*10 }') + M=$i + M=$[$M*1024*1024/10] + echo $M >> speed.txt +done +max=0 +for i in `cat speed.txt` +do + if [ $i -ge $max ] + then + max=$i + fi +done +rm -rf log.txt speed.txt +echo $max +} + +function speedtesthttp(){ +rm -rf log.txt speed.txt +if [ $(echo $1 | grep : | wc -l) == 0 ] +then + curl -x $1:80 http://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 > log.txt 2>&1 +else + curl -x [$1]:80 http://$domain/$file -o /dev/null --connect-timeout 1 --max-time 10 > log.txt 2>&1 +fi +cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep -v 'k\|M' >> speed.txt +for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep k | sed 's/k//g'` +do + k=$i + k=$[$k*1024] + echo $k >> speed.txt +done +for i in `cat log.txt | tr '\r' '\n' | awk '{print $NF}' | sed '1,3d;$d' | grep M | sed 's/M//g'` +do + i=$(echo | awk '{print '$i'*10 }') + M=$i + M=$[$M*1024*1024/10] + echo $M >> speed.txt +done +max=0 +for i in `cat speed.txt` +do + if [ $i -ge $max ] + then + max=$i + fi +done +rm -rf log.txt speed.txt +echo $max +} + +function cloudflaretest(){ +while true +do + while true + do + rm -rf rtt rtt.txt log.txt speed.txt + mkdir rtt + echo "正在生成 $ips" + unset temp + if [ "$ips" == "ipv4" ] + then + n=0 + iplist=100 + while true + do + for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$iplist' {exit}' | awk -F\. '{print $1"."$2"."$3}'` + do + temp[$n]=$(echo $i.$(($RANDOM%256))) + n=$[$n+1] + done + if [ $n -ge $iplist ] + then + break + fi + done + while true + do + if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] + then + break + else + for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$[$iplist-$(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l)]' {exit}' | awk -F\. '{print $1"."$2"."$3}'` + do + temp[$n]=$(echo $i.$(($RANDOM%256))) + n=$[$n+1] + done + fi + done + else + n=0 + iplist=100 + while true + do + for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$iplist' {exit}' | awk -F: '{print $1":"$2":"$3}'` + do + temp[$n]=$(echo $i:$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))) + n=$[$n+1] + done + if [ $n -ge $iplist ] + then + break + fi + done + while true + do + if [ $(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) -ge $iplist ] + then + break + else + for i in `awk 'BEGIN{srand()} {print rand()"\t"$0}' $filename | sort -n | awk '{print $2} NR=='$[$iplist-$(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l)]' {exit}' | awk -F: '{print $1":"$2":"$3}'` + do + temp[$n]=$(echo $i:$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2))):$(printf '%x\n' $(($RANDOM*2+$RANDOM%2)))) + n=$[$n+1] + done + fi + done + fi + ipnum=$(echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u | wc -l) + if [ $tasknum == 0 ] + then + tasknum=1 + fi + if [ $ipnum -lt $tasknum ] + then + tasknum=$ipnum + fi + n=1 + for i in `echo ${temp[@]} | sed -e 's/ /\n/g' | sort -u` + do + echo $i>>rtt/$n.txt + if [ $n == $tasknum ] + then + n=1 + else + n=$[$n+1] + fi + done + n=1 + while true + do + if [ $tls == 1 ] + then + rtthttps $n & + else + rtthttp $n & + fi + if [ $n == $tasknum ] + then + break + else + n=$[$n+1] + fi + done + while true + do + n=$(ls rtt | grep txt | wc -l) + if [ $n -ne 0 ] + then + echo "$(date +'%H:%M:%S') 等待RTT测试结束,剩余进程数 $n" + else + echo "$(date +'%H:%M:%S') RTT测试完成" + break + fi + sleep 1 + done + n=$(ls rtt | grep log | wc -l) + if [ $n == 0 ] + then + echo "当前所有IP都存在RTT丢包" + echo "继续新的RTT测试" + else + cat rtt/*.log > rtt.txt + status=0 + echo "待测速的IP地址" + cat rtt.txt | sort | awk '{print $2" 往返延迟 "$1" 毫秒"}' + for i in `cat rtt.txt | sort | awk '{print $1"_"$2}'` + do + avgms=$(echo $i | awk -F_ '{print $1}') + ip=$(echo $i | awk -F_ '{print $2}') + echo "正在测试 $ip" + if [ $tls == 1 ] + then + max=$(speedtesthttps $ip) + else + max=$(speedtesthttp $ip) + fi + if [ $max -ge $speed ] + then + status=1 + anycast=$ip + max=$[$max/1024] + echo "$ip 峰值速度 $max kB/s" + rm -rf rtt rtt.txt + break + else + max=$[$max/1024] + echo "$ip 峰值速度 $max kB/s" + fi + done + if [ $status == 1 ] + then + break + fi + fi + done + break +done +} + +function singlehttps(){ +read -p "请输入需要测速的IP: " ip +read -p "请输入需要测速的端口(默认443): " port +if [ -z "$ip" ] +then + echo "未输入IP" +fi +if [ -z "$port" ] +then + port=443 +fi +echo "正在测速 $ip 端口 $port" +speed_download=$(curl --resolve $domain:$port:$ip https://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\. '{printf ("%d\n",$1/1024)}') +} + +function singlehttp(){ +read -p "请输入需要测速的IP: " ip +read -p "请输入需要测速的端口(默认80): " port +if [ -z "$ip" ] +then + echo "未输入IP" +fi +if [ -z "$port" ] +then + port=80 +fi +echo "正在测速 $ip 端口 $port" +if [ $(echo $ip | grep : | wc -l) == 0 ] +then + speed_download=$(curl -x $ip:$port http://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\. '{printf ("%d\n",$1/1024)}') +else + speed_download=$(curl -x [$ip]:$port http://$domain:$port/$file -o /dev/null --connect-timeout 5 --max-time 15 -w %{speed_download} | awk -F\. '{printf ("%d\n",$1/1024)}') +fi +} + +function datacheck(){ +clear +echo "如果这些下面这些文件下载失败,可以手动访问网址下载保存至同级目录" +echo "https://www.baipiao.eu.org/cloudflare/colo 另存为 colo.txt" +echo "https://www.baipiao.eu.org/cloudflare/url 另存为 url.txt" +echo "https://www.baipiao.eu.org/cloudflare/ips-v4 另存为 ips-v4.txt" +echo "https://www.baipiao.eu.org/cloudflare/ips-v6 另存为 ips-v6.txt" +while true +do + if [ ! -f "colo.txt" ] + then + echo "从服务器下载数据中心信息 colo.txt" + curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/colo -o colo.txt + elif [ ! -f "url.txt" ] + then + echo "从服务器下载测速文件地址 url.txt" + curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/url -o url.txt + elif [ ! -f "ips-v4.txt" ] + then + echo "从服务器下载IPV4数据 ips-v4.txt" + curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/ips-v4 -o ips-v4.txt + elif [ ! -f "ips-v6.txt" ] + then + echo "从服务器下载IPV6数据 ips-v6.txt" + curl --retry 2 -s https://www.baipiao.eu.org/cloudflare/ips-v6 -o ips-v6.txt + else + break + fi +done +} +datacheck +url=$(sed -n '1p' url.txt) +domain=$(echo $url | cut -f 1 -d'/') +file=$(echo $url | cut -f 2- -d'/') +clear +while true +do + echo "1. IPV4优选(TLS)" + echo "2. IPV4优选" + echo "3. IPV6优选(TLS)" + echo "4. IPV6优选" + echo "5. 单IP测速(TLS)" + echo "6. 单IP测速" + echo "7. 清空缓存" + echo "8. 更新数据" + echo -e "0. 退出\n" + read -p "请选择菜单(默认0): " menu + if [ -z "$menu" ] + then + menu=0 + fi + if [ $menu == 0 ] + then + clear + echo "退出成功" + break + fi + if [ $menu == 1 ] + then + ips=ipv4 + filename=ips-v4.txt + tls=1 + bettercloudflareip + break + fi + if [ $menu == 2 ] + then + ips=ipv4 + filename=ips-v4.txt + tls=0 + bettercloudflareip + break + fi + if [ $menu == 3 ] + then + ips=ipv6 + filename=ips-v6.txt + tls=1 + bettercloudflareip + break + fi + if [ $menu == 4 ] + then + ips=ipv6 + filename=ips-v6.txt + tls=0 + bettercloudflareip + break + fi + if [ $menu == 5 ] + then + singlehttps + clear + echo "$ip 平均速度 $speed_download kB/s" + fi + if [ $menu == 6 ] + then + singlehttp + clear + echo "$ip 平均速度 $speed_download kB/s" + fi + if [ $menu == 7 ] + then + rm -rf rtt rtt.txt log.txt speed.txt + clear + echo "缓存已经清空" + fi + if [ $menu == 8 ] + then + rm -rf colo.txt url.txt ips-v4.txt ips-v6.txt + datacheck + clear + fi +done