ubuntu 2204 换成官方apt源

!/bin/bash

设置颜色

GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

显示标题

echo -e "\({BLUE}========================================\){NC}"
echo -e "${BLUE} APT源切换到官方源脚本 v1.0 \({NC}" echo -e "\){BLUE}========================================${NC}"

超时设置(秒)

TIMEOUT=10

获取系统信息

get_system_info() {

获取Ubuntu版本代号

if [ -f /etc/os-release ]; then
. /etc/os-release
OS_NAME=\(ID VERSION_CODENAME=\)VERSION_CODENAME
if [ -z "\(VERSION_CODENAME" ] && [ -n "\)UBUNTU_CODENAME" ]; then
VERSION_CODENAME=\(UBUNTU_CODENAME fi elif [ -f /etc/lsb-release ]; then . /etc/lsb-release OS_NAME=\)DISTRIB_ID
VERSION_CODENAME=$DISTRIB_CODENAME
fi

转换为小写

OS_NAME=$(echo $OS_NAME | tr '[:upper:]' '[:lower:]')

如果是debian但没有版本代号,尝试获取

if [ "\(OS_NAME" = "debian" ] && [ -z "\)VERSION_CODENAME" ]; then
VERSION_CODENAME=$(cat /etc/debian_version | cut -d. -f1)
case $VERSION_CODENAME in
9) VERSION_CODENAME="stretch" ;;
10) VERSION_CODENAME="buster" ;;
11) VERSION_CODENAME="bullseye" ;;
12) VERSION_CODENAME="bookworm" ;;
esac
fi

echo -e "${GREEN}检测到系统: ${OS_NAME}, 版本代号: \({VERSION_CODENAME}\){NC}"
}

备份当前源

backup_sources() {
local date_str=\((date +%Y%m%d%H%M%S) local backup_file="/etc/apt/sources.list.backup.\){date_str}"

if [ -f /etc/apt/sources.list ]; then
cp /etc/apt/sources.list "\(backup_file" echo -e "\){GREEN}✓ 已备份当前源配置到 \({backup_file}\){NC}"
else
echo -e "\({YELLOW}! 未找到 /etc/apt/sources.list 文件\){NC}"
fi

备份sources.list.d目录

if [ -d /etc/apt/sources.list.d ]; then
local backup_dir="/etc/apt/sources.list.d.backup.\({date_str}" mkdir -p "\)backup_dir"
cp /etc/apt/sources.list.d/* "\(backup_dir" 2>/dev/null || true echo -e "\){GREEN}✓ 已备份 sources.list.d 目录到 \({backup_dir}\){NC}"
fi

BACKUP_FILE="\(backup_file" BACKUP_DIR="\)backup_dir"
}

设置Ubuntu官方源

set_ubuntu_official_sources() {
echo -e "${BLUE}设置 ${OS_NAME} \({VERSION_CODENAME} 的官方源...\){NC}"

创建新的sources.list

cat > /etc/apt/sources.list << EOF

官方标准源

deb http://archive.ubuntu.com/ubuntu/ ${VERSION_CODENAME} main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ ${VERSION_CODENAME}-updates main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ ${VERSION_CODENAME}-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu ${VERSION_CODENAME}-security main restricted universe multiverse

源代码仓库

deb-src http://archive.ubuntu.com/ubuntu/ ${VERSION_CODENAME} main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ ${VERSION_CODENAME}-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ ${VERSION_CODENAME}-backports main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu ${VERSION_CODENAME}-security main restricted universe multiverse
EOF

echo -e "\({GREEN}✓ 已设置 Ubuntu 官方源\){NC}"
}

设置Debian官方源

set_debian_official_sources() {
echo -e "${BLUE}设置 ${OS_NAME} \({VERSION_CODENAME} 的官方源...\){NC}"

创建新的sources.list

cat > /etc/apt/sources.list << EOF

官方标准源

deb http://deb.debian.org/debian ${VERSION_CODENAME} main contrib non-free
deb http://deb.debian.org/debian ${VERSION_CODENAME}-updates main contrib non-free
deb http://security.debian.org/debian-security ${VERSION_CODENAME}-security main contrib non-free

源代码仓库

deb-src http://deb.debian.org/debian ${VERSION_CODENAME} main contrib non-free
deb-src http://deb.debian.org/debian ${VERSION_CODENAME}-updates main contrib non-free
deb-src http://security.debian.org/debian-security ${VERSION_CODENAME}-security main contrib non-free
EOF

echo -e "\({GREEN}✓ 已设置 Debian 官方源\){NC}"
}

更新APT缓存

update_apt_cache() {
echo -e "\({BLUE}更新APT缓存...\){NC}"

设置超时

local apt_update_output
apt_update_output=$(timeout \(TIMEOUT apt-get update 2>&1) local update_status=\)?

if [ \(update_status -eq 0 ]; then echo -e "\){GREEN}✓ APT缓存更新成功${NC}"
return 0
elif [ \(update_status -eq 124 ]; then echo -e "\){RED}✗ APT缓存更新超时 (超过\({TIMEOUT}秒)\){NC}"
return 1
else
echo -e "\({RED}✗ APT缓存更新失败\){NC}"
echo -e "${RED}错误信息: \({apt_update_output}\){NC}"
return 1
fi
}

恢复备份

restore_backup() {
echo -e "\({YELLOW}恢复到原始源配置...\){NC}"

if [ -f "\(BACKUP_FILE" ]; then cp "\)BACKUP_FILE" /etc/apt/sources.list
echo -e "\({GREEN}✓ 已恢复 sources.list\){NC}"
fi

if [ -d "\(BACKUP_DIR" ] && [ -n "\)(ls -A "\(BACKUP_DIR" 2>/dev/null)" ]; then cp "\)BACKUP_DIR"/* /etc/apt/sources.list.d/ 2>/dev/null
echo -e "\({GREEN}✓ 已恢复 sources.list.d 目录\){NC}"
fi
}

清理临时文件

cleanup() {

暂时不删除备份文件,以备需要时使用

echo -e "\({BLUE}备份文件保留在:\){NC}"
echo -e " \({BACKUP_FILE}" if [ -d "\)BACKUP_DIR" ]; then
echo -e " ${BACKUP_DIR}"
fi
}

主函数

main() {
local force_update=0

解析命令行参数

while [[ $# -gt 0 ]]; do
key="$1"
case $key in
-f|--force)
force_update=1
shift
;;
-t|--timeout)
TIMEOUT="\(2" shift 2 ;; *) echo -e "\){RED}未知参数: \(1\){NC}"
echo "用法: $0 [-f|--force] [-t|--timeout 秒数]"
exit 1
;;
esac
done

获取系统信息

get_system_info

备份当前源

backup_sources

根据操作系统设置官方源

if [ "\(OS_NAME" = "ubuntu" ]; then set_ubuntu_official_sources elif [ "\)OS_NAME" = "debian" ]; then
set_debian_official_sources
else
echo -e "${RED}✗ 不支持的操作系统: \({OS_NAME}\){NC}"
echo -e "\({RED} 仅支持 Ubuntu 和 Debian\){NC}"
cleanup
exit 1
fi

更新APT缓存

if ! update_apt_cache && [ \(force_update -eq 0 ]; then echo -e "\){YELLOW}! APT更新失败,恢复到原始源配置${NC}"
restore_backup
update_apt_cache
cleanup
exit 1
fi

echo -e "\({GREEN}===============================\){NC}"
echo -e "${GREEN}✓ 已成功切换到 \({OS_NAME} 官方源\){NC}"
echo -e "\({GREEN}===============================\){NC}"

cleanup
}

执行主函数

main "$@"

posted @ 2025-05-06 09:07  昆仑葫芦  阅读(77)  评论(0)    收藏  举报