闲着没事修改了一下原作者的脚本
添加了以下功能
1、IPv6测速
2、对现有IP进行测速,与上次测速差值超过5MB/s或速度低于5MB/s则重新测速更换优选ip
脚本内容:
#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# --------------------------------------------------------------
# 项目: CloudflareSpeedTest 自动更新 Hosts
# 版本: 1.0.4
# 作者: XI(๐•ᴗ•๐) | XuanRui(新功能,出现bug与原作者无关)
# 项目: https://gith(๐•ᴗ•๐).com/XI(๐•ᴗ•๐)/CloudflareSpeedTest
# --------------------------------------------------------------
_CHECK() {
while true
do
if [[ ! -e "nowip.conf" ]]; then
echo -e "该脚本的作用为 CloudflareST 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。\n使用前请先阅读:https://gith(๐•ᴗ•๐).com/XI(๐•ᴗ•๐)/CloudflareSpeedTest/issues/42#issuecomment-768273848"
echo -e "第一次使用,请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。"
read -e -p "输入该 Cloudflare CDN IPv4 并回车(后续不再需要该步骤):" NOWIPv4
read -e -p "输入该 Cloudflare CDN IPv6 并回车(后续不再需要该步骤):" NOWIPv6
if [[ ! -z "${NOWIPv4}" ]]; then
if [[ ! -z "${NOWIPv6}" ]]; then
#备份hosts
cp -f /etc/hosts /etc/hosts_backup
#写入ip到配置
echo IPv4=${NOWIPv4} >> nowip.conf
echo IPv6=${NOWIPv6} >> nowip.conf
break
else
echo "该 IP 不能是空!"
fi
else
echo "该 IP 不能是空!"
fi
else
break
fi
done
}
_CHECK_NOWIP() {
source nowip.conf
NOW_IPv4_SPEED=$(sed -n "2,1p" result_v4_hosts.txt | awk -F, '{print $6}')
NOW_IPv6_SPEED=$(sed -n "2,1p" result_v6_hosts.txt | awk -F, '{print $6}')
echo -e "\n对当前IPv4进行测速\n"
./CloudflareST -ip $IPv4 -o "result_v4_hosts.txt"
echo -e "\n对当前IPv6进行测速\n"
./CloudflareST -ip $IPv6 -o "result_v6_hosts.txt"
BEST_IPv4_SPEED=$(sed -n "2,1p" result_v4_hosts.txt | awk -F, '{print $6}')
BEST_IPv6_SPEED=$(sed -n "2,1p" result_v6_hosts.txt | awk -F, '{print $6}')
}
_UPDATEv4() {
echo -e "开始v4测速..."
#NOWIP=$(head -1 nowip_hosts.txt)
source nowip.conf
# 这里可以自己添加、修改 CloudflareST 的运行参数
./CloudflareST -f ip.txt -o "result_v4_hosts.txt"
# 如果需要 "找不到满足条件的 IP 就一直循环测速下去",那么可以将下面的两个 exit 0 改为 _UPDATE 即可
[[ ! -e "result_v4_hosts.txt" ]] && echo "CloudflareST 测速结果 IPv4 数量为 0,跳过下面步骤..." && exit 0
# 下面这行代码是 "找不到满足条件的 IP 就一直循环测速下去" 才需要的代码
# 考虑到当指定了下载速度下限,但一个满足全部条件的 IP 都没找到时,CloudflareST 就会输出所有 IP 结果
# 因此当你指定 -sl 参数时,需要移除下面这段代码开头的 # 井号注释符,来做文件行数判断(比如下载测速数量:10 个,那么下面的值就设在为 11)
#[[ $(cat result_v4_hosts.txt|wc -l) > 11 ]] && echo "CloudflareST 测速结果没有找到一个完全满足条件的 IP,重新测速..." && _UPDATE
BESTIPv4=$(sed -n "2,1p" result_v4_hosts.txt | awk -F, '{print $1}')
if [[ -z "${BESTIPv4}" ]]; then
echo "CloudflareST 测速结果 IPv4 数量为 0,跳过下面步骤..."
exit 0
fi
# echo ${BESTIP} > nowip_hosts.txt
sed -i 's/'${IPv4}'/'${BESTIPv4}'/g' nowip.conf
echo -e "\n旧 IPv4 为 ${IPv4}\n新 IPv4 为 ${BESTIPv4}\n"
# echo "开始备份 Hosts 文件(hosts_backup)..."
# \cp -f /etc/hosts /etc/hosts_backup
echo -e "开始替换IPv4..."
sed -i 's/'${IPv4}'/'${BESTIPv4}'/g' /etc/hosts
echo -e "完成..."
}
_UPDATEv6() {
echo -e "开始v6测速..."
#NOWIP=$(head -1 nowip_hosts.txt)
source nowip.conf
# 这里可以自己添加、修改 CloudflareST 的运行参数
./CloudflareST -f ipv6.txt -o "result_v6_hosts.txt"
# 如果需要 "找不到满足条件的 IP 就一直循环测速下去",那么可以将下面的两个 exit 0 改为 _UPDATE 即可
[[ ! -e "result_v6_hosts.txt" ]] && echo "CloudflareST 测速结果 IPv6 数量为0,跳过下面步骤..." && exit 0
# 下面这行代码是 "找不到满足条件的 IP 就一直循环测速下去" 才需要的代码
# 考虑到当指定了下载速度下限,但一个满足全部条件的 IP 都没找到时,CloudflareST 就会输出所有 IP 结果
# 因此当你指定 -sl 参数时,需要移除下面这段代码开头的 # 井号注释符,来做文件行数判断(比如下载测速数量:10 个,那么下面的值就设在为 11)
#[[ $(cat result_v6_hosts.txt|wc -l) > 11 ]] && echo "CloudflareST 测速结果没有找到一个完全满足条件的 IP,重新测速..." && _UPDATE
BESTIPv6=$(sed -n "2,1p" result_v6_hosts.txt | awk -F, '{print $1}')
if [[ -z "${BESTIPv6}" ]]; then
echo "CloudflareST 测速结果 IPv6 数量为 0,跳过下面步骤..."
exit 0
fi
# echo ${BESTIP} > nowip_hosts.txt
sed -i 's/'${IPv6}'/'${BESTIPv6}'/g' nowip.conf
echo -e "\n旧 IPv6 为 ${IPv6}\n新 IPv6 为 ${BESTIPv6}\n"
# echo "开始备份 Hosts 文件(hosts_backup)..."
# \cp -f /etc/hosts /etc/hosts_backup
echo -e "开始替换IPv6..."
sed -i 's/'${IPv6}'/'${BESTIPv6}'/g' /etc/hosts
echo -e "完成..."
}
_RUN () {
if [ $( echo "${BEST_IPv4_SPEED} > 5" | bc) = 1 ];then
if [ $(echo "${BEST_IPv4_SPEED} - ${NOW_IPv4_SPEED} < -5" | bc) = 0 ]; then
echo 当前IPv4测速 ${BEST_IPv4_SPEED}MB/s 合格
else
echo 测速不合格。当前IPv4速度: ${BEST_IPv4_SPEED}MB/s 上次测试速度: ${NOW_IPv4_SPEED}MB/s ,更换IP
_UPDATEv4
fi
else
_UPDATEv4
fi
if [ $(echo "${BEST_IPv6_SPEED} > 5" | bc) = 1 ];then
if [ $(echo "${BEST_IPv6_SPEED} - ${NOW_IPv6_SPEED} < -3" | bc) = 0 ]; then
echo 当前IPv6测速 ${BEST_IPv6_SPEED}MB/s 合格
else
echo 测速不合格。当前IPv6速度: ${BEST_IPv6_SPEED}MB/s 上次测试速度: ${NOW_IPv6_SPEED}MB/s ,更换IP
_UPDATEv6
fi
else
_UPDATEv6
fi
}
_CHECK
_CHECK_NOWIP
_RUN
if(window.hljsLoader && !document.currentScr(๐•ᴗ•๐).parentNode.hasAttribute('data-s9e-livepreview-onupdate')) {
window.hljsLoader.highlightBlocks(document.currentScr(๐•ᴗ•๐).parentNode);
}