#!/bin/bash # Debian 一键更换清华镜像源脚本 (DEB822 格式) # 支持 Debian 12 (bookworm)、13 (trixie)、14 (forky) 及后续版本 set -e # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color TUNA_DEBIAN="https://mirrors.tuna.tsinghua.edu.cn/debian" SECURITY_DEBIAN="https://security.debian.org/debian-security" KEYRING="/usr/share/keyrings/debian-archive-keyring.gpg" SOURCES_FILE="/etc/apt/sources.list.d/debian.sources" LEGACY_LIST="/etc/apt/sources.list" # 检测是否为 root 用户 if [ "$EUID" -ne 0 ]; then echo -e "${RED}错误: 请使用 root 权限运行此脚本${NC}" echo "使用: sudo $0" exit 1 fi # 检测 Debian 版本与代号 detect_debian() { if [ ! -f /etc/os-release ]; then echo -e "${RED}错误: 未检测到 /etc/os-release,无法识别系统${NC}" exit 1 fi . /etc/os-release if [ "${ID:-}" != "debian" ]; then echo -e "${YELLOW}警告: 当前系统 ID 为 '${ID:-未知}',并非纯 Debian,继续操作可能不适用${NC}" fi DEBIAN_VERSION=${VERSION_ID:-$(cut -d. -f1 /etc/debian_version 2>/dev/null)} CODENAME=$(echo "${VERSION_CODENAME:-}" | tr '[:upper:]' '[:lower:]') # 若 os-release 未提供代号,按主版本号兜底推断 if [ -z "$CODENAME" ]; then case "${DEBIAN_VERSION%%.*}" in 12) CODENAME="bookworm" ;; 13) CODENAME="trixie" ;; 14) CODENAME="forky" ;; *) echo -e "${RED}错误: 无法确定 Debian 代号 (版本: ${DEBIAN_VERSION:-未知})${NC}" exit 1 ;; esac fi case "${DEBIAN_VERSION%%.*}" in 12 | 13 | 14) ;; *) echo -e "${YELLOW}警告: 当前 Debian 主版本为 '${DEBIAN_VERSION%%.*}',脚本主要面向 12/13/14,仍将按代号 '${CODENAME}' 生成配置${NC}" ;; esac } # 生成 DEB822 格式的 .sources 内容 generate_sources() { cat <"$LEGACY_LIST" echo -e "${GREEN}已备份并清空旧版 sources.list -> ${LEGACY_LIST}.backup.${stamp}${NC}" fi # 备份已有的 .sources 文件 if [ -f "$SOURCES_FILE" ]; then cp "$SOURCES_FILE" "${SOURCES_FILE}.backup.${stamp}" echo -e "${GREEN}已备份原有 debian.sources -> ${SOURCES_FILE}.backup.${stamp}${NC}" fi mkdir -p "$(dirname "$SOURCES_FILE")" generate_sources >"$SOURCES_FILE" echo -e "${GREEN}已写入清华镜像源配置 -> ${SOURCES_FILE}${NC}\n" echo -e "${YELLOW}正在更新软件包列表...${NC}" apt update echo -e "\n${GREEN}✓ 清华镜像源更换完成!${NC}" } main