gitee_fix_log
修复 Gitee 解析优化脚本
补充说明
gitee_fix_log 用于自动检测 Gitee 域名解析、测试节点连通性、更新 /etc/hosts 固化解析,并记录日志。支持定时任务自动执行,便于长期维护 Gitee 访问稳定性。
环境说明
- 系统:Linux(FnOS / Debian / Ubuntu 等通用)
- 运行身份:root(需修改系统 hosts 文件)
- 日志存放:
/var/log/gitee_fix_log,按日期命名 - 日志留存:最多保留 21 份日志(每日执行 3 次,留存 7 天)
功能特点
- 多 DNS 查询:分别使用 223.5.5.5(阿里)和 114.114.114.114(公共 DNS)解析 Gitee 域名
- IP 连通性测试:批量检测多个 Gitee 节点的响应状态和延迟
- 自动清理:自动删除
/etc/hosts中已有的 Gitee 解析记录 - 固化最优解析:将延迟最低的节点 IP 写入 hosts,稳定生效
- 延迟检测:配置完成后执行 ping 测试,输出最小/平均/最大延迟
- 日志归档:自动创建日志目录,输出重定向至日期命名的日志文件
- 日志清理:内置清理逻辑,自动删除超出 21 份的旧日志
注意事项
- 修改
/etc/hosts需要 root 权限,定时任务也须使用 root 配置 - 建议在网络状况较差时运行,日常访问无需频繁修改
脚本源码
使用 cat 命令直接创建脚本文件至 /usr/local/bin/gitee_fix.sh:
cat > /usr/local/bin/gitee_fix.sh << 'EOF'
#!/bin/bash
# 颜色初始化
list_color_init() {
export gl_hui=$'\033[38;5;59m'
export gl_hong=$'\033[38;5;9m'
export gl_lv=$'\033[38;5;10m'
export gl_huang=$'\033[38;5;11m'
export gl_lan=$'\033[38;5;32m'
export gl_bai=$'\033[38;5;15m'
export gl_zi=$'\033[38;5;13m'
export gl_bufan=$'\033[38;5;14m'
export reset=$'\033[0m'
}
list_color_init
log_info() { echo -e "${gl_lan}[信息]${gl_bai} $*"; }
log_ok() { echo -e "${gl_lv}[成功]${gl_bai} $*"; }
log_warn() { echo -e "${gl_huang}[警告]${gl_bai} $*"; }
log_error() { echo -e "${gl_hong}[错误]${gl_bai} $*" >&2; }
sleep_fractional() {
local seconds=$1
if sleep "$seconds" 2>/dev/null; then return 0; fi
if command -v perl >/dev/null 2>&1; then perl -e "select(undef, undef, undef, $seconds)"; return 0; fi
if command -v python3 >/dev/null 2>&1; then python3 -c "import time; time.sleep($seconds)"; return 0; fi
if command -v python >/dev/null 2>&1; then python -c "import time; time.sleep($seconds)"; return 0; fi
local int_seconds=$(echo "$seconds" | awk '{print int($1+0.999)}')
sleep "$int_seconds"
}
exit_animation() {
echo -ne "${gl_lv}即将退出 ${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.5
echo -ne "${gl_hong}.${gl_huang}.${gl_lv}.${gl_bai}\c"
sleep_fractional 0.6
echo ""
clear
}
query_gitee_dns() {
echo -e "${gl_zi}>>> 查询 Gitee 域名解析 IP${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
log_info "使用 223.5.5.5 阿里DNS解析"
nslookup gitee.com 223.5.5.5
echo ""
log_info "使用 114.114.114.114 公共DNS解析"
nslookup gitee.com 114.114.114.114
}
test_gitee_ip() {
echo -e "${gl_huang}>>> 批量测试 Gitee IP 可用性${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
local ip_list=("180.76.198.225" "180.76.198.77" "180.76.199.13")
for ip in "${ip_list[@]}"; do
log_info "正在测试节点:$ip"
timeout 3 curl -sI -o /dev/null -w "%{http_code} %{time_total}s\n" \
--connect-timeout 2 "https://$ip" -H "Host: gitee.com" -k
done
echo -e ""
}
config_gitee_hosts() {
echo -e "${gl_huang}>>> 清理并配置 /etc/hosts${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
if [ "$(id -u)" -ne 0 ]; then
log_error "修改 hosts 需要 root 权限,请使用 sudo 执行脚本"
return 1
fi
log_info "查看当前 hosts 内 gitee 相关条目"
grep -n "gitee" /etc/hosts || log_info "未发现原有 gitee 条目"
log_info "清理所有 gitee 相关 hosts 记录"
sed -i '/gitee/d' /etc/hosts
local best_ip="180.76.198.225"
log_info "写入最优解析 IP:${best_ip}"
echo "${best_ip} gitee.com" >> /etc/hosts
log_info "验证最终解析结果"
getent hosts gitee.com
log_ok "Gitee hosts 配置完成"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
return 0
}
ping_gitee_check() {
echo -e "${gl_lan}>>> 最终连通性&延迟测试${gl_bai}"
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
local ping_result=$(ping -c 3 gitee.com 2>/dev/null)
if echo "$ping_result" | grep -q "0% packet loss"; then
local rtt=$(echo "$ping_result" | awk '/rtt/ {print $4}')
local min_lat=$(echo "$rtt" | cut -d'/' -f1)
local avg_lat=$(echo "$rtt" | cut -d'/' -f2)
local max_lat=$(echo "$rtt" | cut -d'/' -f3)
log_ok "网络连通正常"
echo -e "${gl_huang}最小延迟: ${gl_bai}${min_lat} ms"
echo -e "${gl_huang}平均延迟: ${gl_bai}${avg_lat} ms"
echo -e "${gl_huang}最大延迟: ${gl_bai}${max_lat} ms"
else
log_error "网络连通异常,存在丢包/请求超时"
fi
echo -e "${gl_bufan}————————————————————————————————————————————————${gl_bai}"
}
# 日志目录与日志文件定义
LOG_DIR="/var/log/gitee_fix_log"
LOG_FILE="${LOG_DIR}/gitee_fix_$(date +%Y-%m-%d).log"
# 自动创建日志目录
mkdir -p "${LOG_DIR}"
# 主程序入口
main() {
clear
query_gitee_dns
test_gitee_ip
config_gitee_hosts
ping_gitee_check
}
# 输出重定向至日志文件
main >> "${LOG_FILE}" 2>&1
# 日志清理:仅保留最新21份日志(7天×每日3次)
ls -1t "${LOG_DIR}"/gitee_fix_*.log 2>/dev/null | tail -n +22 | xargs -r rm -f
EOF
添加脚本执行权限
chmod +x /usr/local/bin/gitee_fix.sh
手动测试脚本
/usr/local/bin/gitee_fix.sh
执行后自动完成以下操作:
- 自动创建日志目录
/var/log/gitee_fix_log - 生成日志文件
gitee_fix_年-月-日.log - 脚本内置日志清理逻辑,自动删除超出 21 份的旧日志
配置定时任务
编辑 root 定时任务列表
必须使用 root 用户配置(脚本需要修改系统 hosts):
crontab -e
添加定时规则
需求:每日执行 3 次,示例采用 00:00、08:00、16:00 三个时间点:
0 0,8,16 * * * /usr/local/bin/gitee_fix.sh >/dev/null 2>&1
格式说明: 分 时 日 月 周 执行命令
0 0,8,16:每小时第 0 分钟,在 0 点、8 点、16 点执行>/dev/null 2>&1:屏蔽定时任务默认输出,避免系统邮件告警
自定义时间:可按需修改小时字段,例如
0 3,11,19 * * *代表凌晨 3 点、上午 11 点、晚上 19 点执行。
- 追加定时任务命令
(crontab -l 2>/dev/null; echo "0 0,8,16 * * * /usr/local/bin/gitee_fix.sh >/dev/null 2>&1") | crontab -
保存退出
- 若使用 vim 编辑器:按
ESC,输入:wq回车保存退出 - 若使用 nano 编辑器:按
Ctrl+O保存,Ctrl+X退出
查看已配置定时任务
crontab -l
日志管理
查看日志目录及文件
ls /var/log/gitee_fix_log/
实时查看当日运行日志
tail -f /var/log/gitee_fix_log/gitee_fix_$(date +%Y-%m-%d).log
手动清理日志
# 保留最新21份日志
ls -1t /var/log/gitee_fix_log/gitee_fix_*.log | tail -n +22 | xargs -r rm -f
规则校验说明
- 日志留存:每日执行 3 次,7 天总计生成 21 份日志,脚本内置清理逻辑,自动删除更早日志
- 权限要求:全程使用 root 身份,普通用户无法修改
/etc/hosts - 异常处理:脚本自带错误输出重定向,运行日志统一归档,便于问题排查
故障排查
定时任务未执行
# 查看状态
systemctl status cron
# 启动
systemctl start cron
# 开机自启
systemctl enable cron
# 重启
systemctl restart cron
# 停止
systemctl stop cron
无日志生成
检查脚本执行权限、日志目录读写权限。
hosts 修改失败
确认运行身份为 root。