随机
Enter 搜索 ↑↓ 切换 Esc 清空

gitee_fix_log

脚本

修复 Gitee 解析优化脚本

gitee_fix_log

修复 Gitee 解析优化脚本

补充说明

gitee_fix_log 用于自动检测 Gitee 域名解析、测试节点连通性、更新 /etc/hosts 固化解析,并记录日志。支持定时任务自动执行,便于长期维护 Gitee 访问稳定性。

环境说明

功能特点

注意事项

脚本源码

使用 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

执行后自动完成以下操作:

配置定时任务

编辑 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 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 -

保存退出

查看已配置定时任务

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

规则校验说明

  1. 日志留存:每日执行 3 次,7 天总计生成 21 份日志,脚本内置清理逻辑,自动删除更早日志
  2. 权限要求:全程使用 root 身份,普通用户无法修改 /etc/hosts
  3. 异常处理:脚本自带错误输出重定向,运行日志统一归档,便于问题排查

故障排查

定时任务未执行

# 查看状态
systemctl status cron

# 启动
systemctl start cron
# 开机自启
systemctl enable cron
# 重启
systemctl restart cron
# 停止
systemctl stop cron

无日志生成

检查脚本执行权限、日志目录读写权限。

hosts 修改失败

确认运行身份为 root。

相关命令