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 "$@"

浙公网安备 33010602011771号