自我良好的2.0 - README.md

### 具体说一下我的改进思路和一些其他说明
1. 我的hosts文件中有许多比较常用的域名,用梯子麻烦也有风险
2. 按照原来的方法我要每个域名运行一次,很慢麻烦,所以就自己在XIU2的代码做了修改
3. 我提供要测速的域名列表,自动抓取hosts文件对应的IP,然后逐一进行测试,然后自动替换最优IP
4. 这个脚本最大的亮点就是不用手动输入域名IP,也不用管现在的现在hosts文件中的IP,只需在域名列表中添加自己需要替换最优IP的域名即可,其他的都是自动化
5. 下面是我改进的脚本代码,只要替换[XIU2作品](https://github.com/XIU2/CloudflareSpeedTest)中的cfst_hosts.sh文件即可
6. 同时对在终端中显示效果做了一些美化,希望大家喜欢
This commit is contained in:
NiJH 2023-07-10 00:07:58 +08:00 committed by GitHub
parent 7fb4c823cf
commit aa8400a503
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 174 additions and 1 deletions

175
README.md
View File

@ -11,8 +11,181 @@
### 具体说一下我的改进思路和一些其他说明
1. 我的hosts文件中有许多比较常用的域名用梯子麻烦也有风险
2. 按照XIU2的思路我要每个域名运行一次很慢麻烦所以就自己在他的代码做了修改
2. 按照原来的方法我要每个域名运行一次很慢麻烦所以就自己在XIU2的代码做了修改
3. 我提供要测速的域名列表自动抓取hosts文件对应的IP然后逐一进行测试然后自动替换最优IP
4. 这个脚本最大的亮点就是不用手动输入域名IP也不用管现在的现在hosts文件中的IP只需在域名列表中添加自己需要替换最优IP的域名即可其他的都是自动化
5. 下面是我改进的脚本代码,只要替换[XIU2作品](https://github.com/XIU2/CloudflareSpeedTest)中的cfst_hosts.sh文件即可
6. 同时对在终端中显示效果做了一些美化,希望大家喜欢
### 具体代码如下:
``` bash
#!/usr/bin/env bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
set -euo pipefail
# --------------------------------------------------------------
# 项目: CloudflareSpeedTest 自动更新 Hosts
# 版本: 2.0
# 作者: wsnjh007参考XIU2的作品修改
# 感谢: 该项目是参考XIU2的作品进行修改特别是他写的CloudflareST程序他的作品详见https://github.com/XIU2/CloudflareSpeedTest
# --------------------------------------------------------------
# 定义文件名
# CloudflareST 程序的文件名
CLOUDFLAREST="CloudflareST"
# 存储当前 IP 地址的文件名
NOWIP_FILE="nowip_hosts.txt"
# 存储测速结果的文件名
RESULT_FILE="result_hosts.txt"
# 你要测速的域名列表
DOMAINS=("www.themoviedb.org" "image.tmdb.org" "api.thetvdb.com" "api.tmdb.org" "api.themoviedb.org" "tmdb.nastool.org" "t.nastool.workers.dev" "webservice.fanart.tv" "api.telegram.org" "www.opensubtitles.org" "dicmusic.club")
# 用于输出的颜色代码
GREEN="\033[0;32m"
RED="\033[0;31m"
YELLOW="\033[1;33m"
NC="\033[0m" # No Color
# 定义三个关联数组来分别存储每个域名的IP和替换状态
declare -A domain_ips
declare -A domain_old_ips
declare -A domain_status
# 定义一个函数_BACKUP_HOSTS用于备份当前的hosts文件。
_BACKUP_HOSTS() {
echo -e "\n${RED}----------------------------------------------------------------------${NC}"
echo -e "${RED}该脚本将在 hosts 文件中查找每个指定域名的当前 IP并进行测速和替换操作${NC}"
echo -e "${RED}----------------------------------------------------------------------${NC}"
if [ -w "/etc/hosts" ]; then
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
echo -e "\n开始备份 Hosts 文件..."
# 将"/volume1/Tool/04_code/hostsupdate"改成自己的路径
cp -f /etc/hosts "/volume1/Tool/04_code/hostsupdate/hosts_backup_${TIMESTAMP}"
echo -e "${GREEN}完成...${NC}"
else
echo -e "${YELLOW}无法备份 Hosts 文件,检查你的权限${NC}"
exit 1
fi
}
# 获取所有域名的当前IP的函数
_INIT_IP() {
for DOMAIN in "${DOMAINS[@]}"; do
# 通过对 grep 命令的结果进行进一步处理,确保只取出一个 IP。
NOWIP=$(grep ${DOMAIN} /etc/hosts | head -n 1 | awk '{print $1}')
if [[ ! -z "${NOWIP}" ]]; then
domain_ips["${DOMAIN}"]=${NOWIP} # 存储当前IP到关联数组中
domain_old_ips["${DOMAIN}"]=${NOWIP} # 存储旧的IP到关联数组中
else
echo -e "${RED}在 hosts 文件中未找到 ${DOMAIN} 的 IP 地址,跳过此域名的测速和替换操作${NC}"
fi
done
}
# 进行测速并更新hosts文件
_UPDATE() {
# 删除之前运行的结果文件,保证每次运行都是新的结果
if [ -f "${RESULT_FILE}" ]; then
rm -f "${RESULT_FILE}"
fi
if [ -f "${NOWIP_FILE}" ]; then
rm -f "${NOWIP_FILE}"
fi
# 对每个在DOMAINS列表中的域名进行处理
for DOMAIN in "${DOMAINS[@]}"; do
# 从我们之前存储的关联数组中获取当前域名的IP
NOWIP=${domain_ips["${DOMAIN}"]}
# 输出开始测速的信息
echo -e "\n------------------------------------------------------------"
echo -e "${GREEN}【${DOMAIN}】${NC}开始测速..."
# 使用CloudflareST工具进行测速将结果存储在临时文件中
./"${CLOUDFLAREST}" -o "temp_result_hosts.txt"
# 从测速结果中获取最快的IP地址
BESTIP=$(sed -n "2,1p" temp_result_hosts.txt | awk -F, '{print $1}')
# 如果没有获取到最快的IP则跳过后续的步骤进行下一个域名的处理
if [[ -z "${BESTIP}" ]]; then
echo "CloudflareST 测速结果 IP 数量为 0跳过下面步骤..."
continue
fi
# 输出旧的IP和新的IP
echo -e "\n旧 IP 为 ${NOWIP}\n新 IP 为 ${BESTIP}\n"
# 输出开始替换的信息
echo -e "开始替换..."
# 在hosts文件中将旧的IP替换为新的IP
sed -i "s#${NOWIP}#${BESTIP}#g" /etc/hosts
# 检查替换是否成功
if grep -q "${BESTIP}" /etc/hosts; then
# 如果替换成功将新的IP和域名写入到结果文件中并存储替换状态到关联数组中
echo ${BESTIP} ${DOMAIN} >> "${NOWIP_FILE}"
echo -e "${DOMAIN} 替换成功\n旧 IP 为 ${NOWIP}\n新 IP 为 ${BESTIP}" >> "${RESULT_FILE}"
domain_status["${DOMAIN}"]="替换成功"
domain_ips["${DOMAIN}"]=${BESTIP} # 更新当前域名的 IP 地址
echo -e "\n\n" >> "${RESULT_FILE}"
echo -e "${GREEN}完成...${NC}\n"
else
# 如果替换失败将旧的IP和域名写入到结果文件中并存储替换状态到关联数组中
NOWIP=$(awk '/'${DOMAIN}'/{print $1}' /etc/hosts)
echo ${NOWIP} ${DOMAIN} >> "${NOWIP_FILE}"
echo -e "${DOMAIN} 替换失败 \n当前 IP 为 ${NOWIP}" >> "${RESULT_FILE}"
domain_status["${DOMAIN}"]="替换失败"
echo -e "\n\n" >> "${RESULT_FILE}"
echo -e "${RED}失败...${NC}${YELLOW} 可能原因包括没有正确的文件权限或者hosts文件不存在。${NC}\n"
fi
# 删除临时的测速结果文件
if [ -f "temp_result_hosts.txt" ]; then
echo -e "开始删除 temp_result_hosts.txt 文件..."
rm -f "temp_result_hosts.txt"
echo -e "${GREEN}完成...${NC}\n \n"
else
echo -e "${YELLOW}未找到 temp_result_hosts.txt 文件${NC}\n \n"
fi
done
}
# 显示结果的函数
_DISPLAY_RESULT() {
echo -e "\n${YELLOW}下面是本次运行的结果汇总:${NC}"
echo -e "-----------------------------------------------------------"
for DOMAIN in "${DOMAINS[@]}"; do
OLDIP=${domain_old_ips["${DOMAIN}"]}
NOWIP=${domain_ips["${DOMAIN}"]}
echo -e "域名:${GREEN}${DOMAIN}${NC}"
echo -e "旧 IP${OLDIP}"
if [[ ${domain_status["${DOMAIN}"]} == "替换成功" ]]; then
echo -e "新 IP${NOWIP}" # 引用新的 IP 地址
echo -e "${GREEN}替换成功${NC}\n"
elif [[ ${domain_status["${DOMAIN}"]} == "替换失败" ]]; then
echo -e "${RED}替换失败${NC}\n"
fi
done
echo -e "-----------------------------------------------------------"
echo -e "${NC}" # 结束时重置颜色。
}
# 定义一个函数MAIN用于执行上面定义的所有函数。
_MAIN() {
_BACKUP_HOSTS
_INIT_IP
_UPDATE
_DISPLAY_RESULT
}
# 执行_MAIN函数
_MAIN
```