#!/bin/bash #by spiritlhl #from https://github.com/spiritLHLS/one-click-installation-script #version: 2023.01.02 red(){ echo -e "\033[31m\033[01m$1$2\033[0m"; } green(){ echo -e "\033[32m\033[01m$1$2\033[0m"; } yellow(){ echo -e "\033[33m\033[01m$1$2\033[0m"; } reading(){ read -rp "$(green "$1")" "$2"; } head() { # 支持系统:Ubuntu 12+,Debian 6+ ver="2023.01.02" changeLog="一键修复apt源,加载对应的源" clear echo "#######################################################################" echo "# ${YELLOW}一键修复apt源脚本${PLAIN} #" echo "# 版本:$ver #" echo "# 更新日志:$changeLog #" echo "# ${GREEN}作者${PLAIN}: spiritlhl #" echo "# ${GREEN}作仓库${PLAIN}: https://github.com/spiritLHLS/one-click-installation-script #" echo "#######################################################################" echo "支持系统:Ubuntu 12+,Debian 6+" echo "0.修复apt源broken损坏" echo "1.修复apt源锁死" echo "2.修复apt源公钥缺失" echo "3.修复替换系统可用的apt源列表,国内用阿里源,国外用官方源" echo "4.修复本机的Ubuntu系统是EOL非长期维护的版本,将替换为Ubuntu官方的old-releases仓库以支持apt的使用" # Display prompt asking whether to proceed with checking reading "Do you want to proceed with checking? [y/n] " confirm echo "" # Check user's input and exit if they do not want to proceed if [ "$confirm" != "y" ]; then exit 0 fi } backup_source() { # Backup current sources list if test -f /etc/apt/sources.list.bak; then sudo cp /etc/apt/sources.list /etc/apt/sources.list2.bak yellow "backup the current /etc/apt/sources.list to /etc/apt/sources.list2.bak" else sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak yellow "backup the current /etc/apt/sources.list to /etc/apt/sources.list.bak" fi } change_debian_apt_sources() { # Check if the IP is in China ip=$(curl -s https://ipapi.co/ip) location=$(curl -s https://ipapi.co/$ip/country_name) # Backup current sources list cp /etc/apt/sources.list /etc/apt/sources.list.bak yellow "backup the current /etc/apt/sources.list to /etc/apt/sources.list.bak" # Determine Debian version DEBIAN_VERSION=$(lsb_release -sr) # Use official sources list if IP is not in China if [ "$location" != "China" ]; then URL="http://deb.debian.org/debian" else # Use mirrors.aliyun.com sources list if IP is in China URL="http://mirrors.aliyun.com/debian" fi # Set Debian release based on Debian version case $DEBIAN_VERSION in 6*) DEBIAN_RELEASE="squeeze";; 7*) DEBIAN_RELEASE="wheezy";; 8*) DEBIAN_RELEASE="jessie";; 9*) DEBIAN_RELEASE="stretch";; 10*) DEBIAN_RELEASE="buster";; 11*) DEBIAN_RELEASE="bullseye";; *) echo "The system is not Debian 6/7/8/9/10/11 . No changes were made to the apt-get sources." && return 1;; esac # Write sources list in the desired format cat > /etc/apt/sources.list < /etc/apt/sources.list < /etc/apt/sources.list <&1 | tee update_output.log exit_code=$? # Check the update output for "does not have a Release file" error if grep -Eq "does not have a Release file|Malformed entry" update_output.log; then # Check if the system is Ubuntu or Debian if [ -f /etc/os-release ]; then # Get the value of the ID variable ID=$(lsb_release -i | awk '{print $3}') # If the ID is ubuntu, run the change_ubuntu_apt_sources script if [ "$ID" == "ubuntu" ]; then yellow "ubuntu" check_eol_and_switch_apt_source change_ubuntu_apt_sources fi # If the ID is debian, run the change_debian_apt_sources script if [ "$ID" == "debian" ]; then yellow "debian" change_debian_apt_sources fi fi else # If the update was successful and no errors were found, exit the script if [ $exit_code -eq 0 ]; then # Print a message indicating that the update was successful green "The apt-get update was successful." exit 0 fi fi # Update the package list rm -rf update_output.log apt-get update 2>&1 | tee update_output.log exit_code=$? # Check the exit status of the update command if [ $exit_code -ne 0 ] || grep -Eq "does not have a Release file|Malformed entry" update_output.log; then # Print a message indicating that the update failed yellow "The update failed. Attempting to replace the apt-get sources..." # Check if the system is Debian or Ubuntu if [ -f /etc/debian_version ]; then # Display prompt asking whether to proceed with updating reading "Do you want to proceed with updating? [y/n] " updating echo "" # Check user's input and exit if they do not want to proceed if [ "$updating" != "y" ]; then exit 0 else change_debian_apt_sources fi elif [ -f /etc/lsb-release ]; then # Display prompt asking whether to proceed with updating reading "Do you want to proceed with updating? [y/n] " updating echo "" # Check user's input and exit if they do not want to proceed if [ "$updating" != "y" ]; then exit 0 else check_eol_and_switch_apt_source change_ubuntu_apt_sources fi else # Print a message indicating that the system is not supported red "This system is not supported. The apt-get sources will not be modified." fi fi } check_again() { # Update the package list again to pick up the new sources sudo apt-get update # Check the exit status of the update command if [ $? -eq 0 ]; then # Print a message indicating that the update was successful green "The apt-get update was successful." else # Print a message indicating that the update failed and suggest other error resolution methods red "The update failed. You may want to try the following error resolution methods: - Check your internet connection - Check the sources list for errors - Check for package dependencies - Check for disk space issues" fi } ############################################################################################################################################## head fix_broken sleep 1 fix_locked sleep 1 fix_sources sleep 1 check_again