#!/bin/bash #by spiritlhl #from https://github.com/spiritLHLS/one-click-installation-script #version: 2023.07.30 utf8_locale=$(locale -a 2>/dev/null | grep -i -m 1 -E "UTF-8|utf8") if [[ -z "$utf8_locale" ]]; then echo "No UTF-8 locale found" else export LC_ALL="$utf8_locale" export LANG="$utf8_locale" export LANGUAGE="$utf8_locale" echo "Locale set to $utf8_locale" fi temp_file_apt_fix="/tmp/apt_fix.txt" 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.05.31" 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的使用" echo "5.修复只保证apt update不会报错,其他命令报错未修复" echo "6.如若修复后install还有问题,重启服务器解决问题" # 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";; 12*) DEBIAN_RELEASE="bookworm";; *) echo "The system is not Debian 6/7/8/9/10/11/12 . 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) if echo $output | grep -q "NO_PUBKEY"; then echo "Some keys are missing, attempting to retrieve them now..." missing_keys=$(echo $output | grep "NO_PUBKEY" | awk -F' ' '{print $NF}') for key in $missing_keys; do sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys $key done apt-get update else echo "All keys are present." fi fi } fix_sources() { # Update the package list rm -rf update_output.log apt-get update 2>&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 } fix_install() { # ps aux | grep apt sudo pkill apt if lsof /var/lib/dpkg/lock > /dev/null 2>&1; then sudo kill $(sudo lsof /var/lib/dpkg/lock | awk '{print $2}') sudo rm /var/lib/dpkg/lock fi if lsof /var/cache/apt/archives/lock > /dev/null 2>&1; then sudo kill $(sudo lsof /var/cache/apt/archives/lock | awk '{print $2}') sudo rm -rf /var/cache/apt/archives/lock fi if sudo lsof /var/lib/apt/lists/lock > /dev/null 2>&1; then sudo kill $(sudo lsof /var/lib/apt/lists/lock | awk '{print $2}') sudo rm /var/lib/apt/lists/lock fi sudo apt-get clean sudo apt-get update sudo dpkg --configure -a } check_again() { # Update the package list again to pick up the new sources apt_update_output=$(apt-get update 2>&1) echo "$apt_update_output" > "$temp_file_apt_fix" if grep -q 'NO_PUBKEY' "$temp_file_apt_fix"; then public_keys=$(grep -oE 'NO_PUBKEY [0-9A-F]+' "$temp_file_apt_fix" | awk '{ print $2 }') joined_keys=$(echo "$public_keys" | paste -sd " ") yellow "No Public Keys: ${joined_keys}" apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ${joined_keys} apt-get update fi rm "$temp_file_apt_fix" 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_install sleep 1 fix_broken sleep 1 fix_locked sleep 1 fix_sources sleep 1 fix_install sleep 1 check_again