Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本v9版

news2024/12/27 12:57:17

Rocky、Almalinux、CentOS、Ubuntu和Debian系统初始化脚本

在这里插入图片描述

Shell脚本源码地址:

Gitee:https://gitee.com/raymond9/shell
Github:https://github.com/raymond999999/shell

脚本可以去上面的Gitee或Github代码仓库拉取。

支持的功能和系统:

支持的功能支持的系统
修改网卡名、修改IP地址和网关地址(单网卡和双网卡)、设置主机名、设置镜像仓库、Minimal安装建议安装软件、关闭防火墙、禁用SELinux、禁用SWAP、设置系统时区、优化资源限制参数、优化内核参数、优化SSH、更改SSH端口号、设置系统别名、设置vimrc配置文件、安装邮件服务并配置、设置PS1、设置默认文本编辑器为vim、设置history格式、禁用ctrl+alt+del重启、Ubuntu和Debian设置root用户登录、Ubuntu卸载无用软件包、Ubuntu卸载snap。Rocky 8和9、AlmaLinux 8和9、CentOS 7、CentOS Stream 8和9、Ubuntu 18.04/20.04/22.04/24.04、Debian 12

v1和v2版本的区别:

v1和v2版本实现的功能都是一样的,只是实现的方式不同。

v1v2
1.Rocky、Almalinux、CentOS系统修改ip地址采用nmcli命令方式;1.Rocky、Almalinux、CentOS系统修改ip地址采用的是配置文件方式;
2.Rocky、Almalinux、CentOS、Ubuntu和Debian系统修改镜像仓库采用sed直接替换网址方式。2.Rocky、Almalinux、CentOS、Ubuntu和Debian系统修改镜像仓库采用的是配置文件方式。

版本更新日志:

版本功能
v9版更新内容1.由于CentOS Stream 8 已于 2024 年 5 月 31 日到期, CentOS Linux 7 的生命周期结束日期是 2024 年 6 月 30 日,将CentOS Stream 8和CentOS 7的镜像仓库都改成了centos-vault仓库;把CentOS 7的epel仓库改成了epel-archive仓库;
2.添加了对Ubuntu 24.04系统的支持;(Ubuntu 24.04的变更:网卡配置文件变成了“/etc/netplan/50-cloud-init.yaml”,镜像仓库格式变成了DEB822 格式,ssh服务的服务名变成了ssh;)
3.添加了对Debian 12系统的支持;
4.修改了某些bug。
v8版更新内容1.添加了对AlmaLinux 8和9系统的支持;
2.添加Ubuntu卸载snap的功能;
3.修改了某些bug。
v7版更新内容1.由于v6版修改的比较仓促,其中设置镜像仓库有bug,修复了其中的bug,而且设置镜像仓库可以重复修改;修复了设置ip不能成功的bug;优化了设置系统别名的bug;修复了“优化内核参数”的bug;
2.分别有reset_v7_1版本(镜像仓库采用sed直接替换网址方式;修改ip地址采用nmcli命令方式)和reset_v7_2版本(镜像仓库和修改ip地址采用配置文件方式)。
v6版更新内容1.由于CentOS 6和8官方已经停止支持,也就移除了其相关内容;
2.分别有reset_v6_1版本(镜像仓库采用sed直接替换网址方式;修改ip地址采用nmcli命令方式)和reset_v6_2版本(镜像仓库和修改ip地址采用配置文件方式);
3.reset_v6_1添加了CentOS Stream 9用Perl语言更改镜像源的方法,优化了某些镜像仓库失效的bug,修改了某些bug。
v5版更新内容1.优化了某些镜像仓库失效的bug;
2.CentOS stream 9和Rocky 9修改ip的方式更改,做了相应的修改;
3.分别有reset_v5_1版本(镜像仓库采用sed直接替换网址方式;修改ip地址采用nmcli命令方式)和reset_v5_2版本(镜像仓库和修改ip地址采用配置文件方式);
4.把设置PS1、设置默认文本编辑器为vim和设置history格式单独分开;
5.修改了某些bug。
v4版更新内容1.添加对CentOS stream 9、Rocky 9和Ubuntu 22.04系统的支持;
2.添加Ubuntu 22.04修改IP地址和网关地址、双网卡更改IP地址;
3.添加禁用ctrl+alt+del重启功能;
4.修改了某些bug。
v3版更新内容1.添加双网卡更改IP地址;
2.添加设置系统时区。
v2版更新内容1.添加对CentOS stream 8系统支持,添加了CentOS stream 8镜像仓库;
2.由于CentOS 8已被废弃,修改成centos-vault的历史镜像仓库;
3.优化Ubuntu 20.04禁用swap不生效的问题。
v1版支持功能1.支持CentOS 6/7/8、Ubuntu 18.04/20.04、Rocky 8系统;
2.支持功能禁用SELinux、关闭防火墙、优化SSH、设置系统别名、设置vimrc配置文件、设置软件包仓库、Minimal安装建议安装软件、安装邮件服务并配置邮件、更改SSH端口号、修改网卡名、修改IP地址和网关地址、设置主机名、设置PS1和系统环境变量、禁用SWAP、优化内核参数、优化资源限制参数、Ubuntu设置root用户登录、Ubuntu卸载无用软件包。

reset脚本在使用过程中需要注意的事项:

  1. 首先说明,脚本必须在root用户下使用。

    # Rocky、Almalinux、和CentOS默认可以使用root用户登录不用设置,Ubuntu和Debian必须先设置root用户登录。
    # 先安装lrzsz工具,把脚本传上去
    raymond@ubuntu2404:~$ sudo apt -y install lrzsz
    raymond@ubuntu2404:~$ rz -E
    rz waiting to receive.
    
    # 使用bash命令运行脚本
    raymond@ubuntu2404:~$ bash reset_v9_1.sh 
    
    **********************************************************************
    *                           初始化脚本菜单                           *
    * 1.修改网卡名                     15.设置系统别名                   *
    * 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
    * 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
    * 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
    * 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
    * 6.Minimal安装建议安装软件        20.设置history格式                *
    * 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
    * 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
    * 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
    * 10.设置系统时区                  24.Ubuntu卸载snap                 *
    * 11.优化资源限制参数              25.重启系统                       *
    * 12.优化内核参数                  26.关机                           *
    * 13.优化SSH                       27.退出                           *
    * 14.更改SSH端口号                                                   *
    **********************************************************************
    
    请选择相应的编号(1-27): 22 # 输入22,设置root用户登录
    请输入密码: 123456 # 输入密码
    New password: Retype new password: passwd: password updated successfully
    Ubuntu 24.04 root用户登录已设置完成,请重新登录后生效!
    
    **********************************************************************
    *                           初始化脚本菜单                           *
    * 1.修改网卡名                     15.设置系统别名                   *
    * 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
    * 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
    * 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
    * 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
    * 6.Minimal安装建议安装软件        20.设置history格式                *
    * 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
    * 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
    * 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
    * 10.设置系统时区                  24.Ubuntu卸载snap                 *
    * 11.优化资源限制参数              25.重启系统                       *
    * 12.优化内核参数                  26.关机                           *
    * 13.优化SSH                       27.退出                           *
    * 14.更改SSH端口号                                                   *
    **********************************************************************
    
    请选择相应的编号(1-27): 27 # 退出脚本
    
    # 然后用root用户登录
    [C:\~]$ ssh root:123456@172.31.7.2
    
    # 把脚本从普通用户家目录移到root用户家目录,再继续后面步骤。
    root@ubuntu2404:~# mv /home/raymond/reset_v9_1.sh .
    
  2. CentOS Stream 9如果使用v1版本修改镜像源需要注意的地方。

    # 先安装lrzsz工具,把脚本传上去
    [root@centos9 ~]# dnf -y install lrzsz
    [root@centos9 ~]# rz -E
    rz waiting to receive.
    [root@centos9 ~]# ls
    anaconda-ks.cfg  reset_v9_1.sh
    
    [root@centos9 ~]# bash reset_v9_1.sh 
    
    **********************************************************************
    *                           初始化脚本菜单                           *
    * 1.修改网卡名                     15.设置系统别名                   *
    * 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
    * 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
    * 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
    * 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
    * 6.Minimal安装建议安装软件        20.设置history格式                *
    * 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
    * 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
    * 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
    * 10.设置系统时区                  24.Ubuntu卸载snap                 *
    * 11.优化资源限制参数              25.重启系统                       *
    * 12.优化内核参数                  26.关机                           *
    * 13.优化SSH                       27.退出                           *
    * 14.更改SSH端口号                                                   *
    **********************************************************************
    
    请选择相应的编号(1-27): 5
    
    1)base仓库
    2)epel仓库
    3)启用CentOS Stream 9 crb仓库
    4)启用CentOS Stream 8 PowerTools仓库
    5)退出
    
    请输入镜像源编号(1-5): 1
    由于CentOS Stream 9系统默认镜像源是Perl语言实现的,在更改镜像源之前先确保把'update_mirror.pl'文件和reset脚本放在同一个目录下,否则后面程序会退出,默认的CentOS Stream 9镜像源设置的是阿里云,要修改镜像源,请去'update_mirror.pl'文件里修改url变量!
    缺少update_mirror.pl文件 # 这里提示“缺少update_mirror.pl文件”,上面的提示也写得很清楚,需要把这个文件也传到系统里
    
    [root@centos9 ~]# rz -E
    rz waiting to receive.
    [root@centos9 ~]# ls
    anaconda-ks.cfg  reset_v9_1.sh  update_mirror.pl
    
    [root@centos9 ~]# bash reset_v9_1.sh 
    
    **********************************************************************
    *                           初始化脚本菜单                           *
    * 1.修改网卡名                     15.设置系统别名                   *
    * 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
    * 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
    * 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
    * 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
    * 6.Minimal安装建议安装软件        20.设置history格式                *
    * 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
    * 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
    * 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
    * 10.设置系统时区                  24.Ubuntu卸载snap                 *
    * 11.优化资源限制参数              25.重启系统                       *
    * 12.优化内核参数                  26.关机                           *
    * 13.优化SSH                       27.退出                           *
    * 14.更改SSH端口号                                                   *
    **********************************************************************
    
    请选择相应的编号(1-27): 5
    
    1)base仓库
    2)epel仓库
    3)启用CentOS Stream 9 crb仓库
    4)启用CentOS Stream 8 PowerTools仓库
    5)退出
    
    请输入镜像源编号(1-5): 1
    由于CentOS Stream 9系统默认镜像源是Perl语言实现的,在更改镜像源之前先确保把'update_mirror.pl'文件和reset脚本放在同一个目录下,否则后面程序会退出,默认的CentOS Stream 9镜像源设置的是阿里云,要修改镜像源,请去'update_mirror.pl'文件里修改url变量!
    update_mirror.pl文件已准备好,继续后续配置! # 现在这里提示“update_mirror.pl文件已准备好,继续后续配置!”。
    安装perl工具,请稍等...
    更新镜像源中,请稍等...
    CentOS 9 YUM源设置完成!
    
    1)base仓库
    2)epel仓库
    3)启用CentOS Stream 9 crb仓库
    4)启用CentOS Stream 8 PowerTools仓库
    5)退出
    
    请输入镜像源编号(1-5): 5
    
    **********************************************************************
    *                           初始化脚本菜单                           *
    * 1.修改网卡名                     15.设置系统别名                   *
    * 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
    * 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
    * 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
    * 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
    * 6.Minimal安装建议安装软件        20.设置history格式                *
    * 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
    * 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
    * 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
    * 10.设置系统时区                  24.Ubuntu卸载snap                 *
    * 11.优化资源限制参数              25.重启系统                       *
    * 12.优化内核参数                  26.关机                           *
    * 13.优化SSH                       27.退出                           *
    * 14.更改SSH端口号                                                   *
    **********************************************************************
    
    请选择相应的编号(1-27): 27
    
  3. 其它功能根据需求选择,如果有需要输入的根据提示输入即可,这里不再一一演示。

下面是reset_v9_1脚本内容:

[root@rocky9 ~]# cat reset_v9_1.sh
#!/bin/bash
#
#**********************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2024-10-31
#FileName:      reset_v9_1.sh
#MIRROR:        raymond.blog.csdn.net
#Description:   The reset linux system initialization script supports 
#               “Rocky Linux 8 and 9, Almalinux 8 and 9, CentOS 7, 
#               CentOS Stream 8 and 9, Ubuntu 18.04, 20.04, 22.04 and 24.04, 
#               Debian 12“ operating systems.
#Copyright (C): 2024 All rights reserved
#**********************************************************************************
COLOR="echo -e \\033[01;31m"
END='\033[0m'

os(){
    OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
    OS_NAME=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+) (.*)"$@\2@p' /etc/os-release`
    OS_RELEASE=`sed -rn '/^VERSION_ID=/s@.*="?([0-9.]+)"?@\1@p' /etc/os-release`
    OS_RELEASE_VERSION=`sed -rn '/^VERSION_ID=/s@.*="?([0-9]+)\.?.*"?@\1@p' /etc/os-release`
}

set_rocky_almalinux_centos_eth(){
    if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
        ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
        if grep -Eqi "(net\.ifnames|biosdevname)" /etc/default/grub;then
            ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名配置文件已修改,不用修改!"${END}
        else
            # 修改网卡名称配置文件
            sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0 biosdevname=0"@' /etc/default/grub
            grub2-mkconfig -o /boot/grub2/grub.cfg >& /dev/null

            # 修改网卡文件名
            mv /etc/sysconfig/network-scripts/ifcfg-${ETHNAME} /etc/sysconfig/network-scripts/ifcfg-eth0
            ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名已修改成功,10秒后,机器会自动重启!"${END}
            sleep 10 && shutdown -r now
        fi   
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 不能修改网卡名!"${END} 
    fi
}

set_ubuntu_debian_eth(){
    # 修改网卡名称配置文件
    if grep -Eqi "(net\.ifnames|biosdevname)" /etc/default/grub;then
        ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名配置文件已修改,不用修改!"${END}
    else
        sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@net.ifnames=0 biosdevname=0"@' /etc/default/grub
        grub-mkconfig -o /boot/grub/grub.cfg >& /dev/null
        ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名已修改成功,请重新启动系统后才能生效!"${END}
    fi
}

set_eth(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        set_rocky_almalinux_centos_eth
    else
        set_ubuntu_debian_eth
    fi
}

check_ip(){
    local IP=$1
    VALID_CHECK=$(echo ${IP}|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
    if echo ${IP}|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
        if [ ${VALID_CHECK} == "yes" ]; then
            echo "IP ${IP}  available!"
            return 0
        else
            echo "IP ${IP} not available!"
            return 1
        fi
    else
        echo "IP format error!"
        return 1
    fi
}

set_rocky_almalinux_centos_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    CONNECTION_NAME=`nmcli dev | awk 'NR==2{print $4,$5,$6}'`
    while true; do
        read -p "请输入IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请使用新IP重新登录!"${END}
    if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
        nmcli connection modify "${CONNECTION_NAME}" con-name ${ETHNAME} && \
        nmcli connection delete ${ETHNAME} >& /dev/null && \
        nmcli connection add type ethernet con-name ${ETHNAME} ifname ${ETHNAME} ipv4.method manual ipv4.address "${IP}/${PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "${PRIMARY_DNS},${BACKUP_DNS}" autoconnect yes >& /dev/null && \
        nmcli con reload && nmcli dev up ${ETHNAME} >& /dev/null
    else
        nmcli connection delete ${ETHNAME} >& /dev/null && \
        nmcli connection add type ethernet con-name ${ETHNAME} ifname ${ETHNAME} ipv4.method manual ipv4.address "${IP}/${PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "${PRIMARY_DNS},${BACKUP_DNS}" autoconnect yes >& /dev/null && \
        nmcli con reload && nmcli dev up ${ETHNAME} >& /dev/null
    fi
}

set_ubuntu_ip(){
    while true; do
        read -p "请输入IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    if [ ${OS_RELEASE_VERSION} == "18" ];then
        cat > /etc/netplan/01-netcfg.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    elif [ ${OS_RELEASE_VERSION} == "20" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    elif [ ${OS_RELEASE_VERSION} == "22" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    else
        cat > /etc/netplan/50-cloud-init.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    fi    
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_debian_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    while true; do
        read -p "请输入IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    sed -ri -e "s/allow-hotplug ${ETHNAME}/auto eth0/g" -e "s/(iface) ${ETHNAME} (inet) dhcp/\1 eth0 \2 static/g" /etc/network/interfaces
    cat >> /etc/network/interfaces <<-EOF
address ${IP}/${PREFIX}
gateway ${GATEWAY}
dns-nameservers ${PRIMARY_DNS} ${BACKUP_DNS}
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_ip(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        set_rocky_almalinux_centos_ip
    elif [ ${OS_ID} == "Ubuntu" ];then
        set_ubuntu_ip
    else
        set_debian_ip
    fi
}

set_dual_rocky_almalinux_centos_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    ETHNAME2=`ip addr | awk -F"[ :]" '/^3/{print $3}'`
    CONNECTION_NAME1=`nmcli dev | awk 'NR==2{print $4,$5,$6}'`
    CONNECTION_NAME2=`nmcli dev | awk 'NR==3{print $4,$5,$6}'`
    while true; do
        read -p "请输入第一块网卡IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX2
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请使用新IP重新登录!"${END}
    if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
        nmcli connection modify "${CONNECTION_NAME1}" con-name ${ETHNAME} && nmcli connection delete ${ETHNAME} >& /dev/null && \
		nmcli connection add type ethernet con-name ${ETHNAME} ifname ${ETHNAME} ipv4.method manual ipv4.address "${IP}/${PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "${PRIMARY_DNS},${BACKUP_DNS}" autoconnect yes >& /dev/null && \
        nmcli connection modify "${CONNECTION_NAME2}" con-name ${ETHNAME2} && nmcli connection delete ${ETHNAME2} >& /dev/null && \
		nmcli connection add type ethernet con-name ${ETHNAME2} ifname ${ETHNAME2} ipv4.method manual ipv4.address "${IP2}/${PREFIX2}" autoconnect yes >& /dev/null && \
        nmcli con reload && nmcli dev up ${ETHNAME} ${ETHNAME2} >& /dev/null
    else
        nmcli connection delete ${ETHNAME} >& /dev/null && \
        nmcli connection add type ethernet con-name ${ETHNAME} ifname ${ETHNAME} ipv4.method manual ipv4.address "${IP}/${PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "${PRIMARY_DNS},${BACKUP_DNS}" autoconnect yes >& /dev/null && \
        nmcli connection modify "${CONNECTION_NAME2}" con-name ${ETHNAME2} && nmcli connection delete ${ETHNAME2} >& /dev/null && \
        nmcli connection add type ethernet con-name ${ETHNAME2} ifname ${ETHNAME2} ipv4.method manual ipv4.address "${IP2}/${PREFIX2}" autoconnect yes >& /dev/null && \
        nmcli con reload && nmcli dev up ${ETHNAME} ${ETHNAME2} >& /dev/null
    fi
}

set_dual_ubuntu_ip(){
    while true; do
        read -p "请输入第一块网卡IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX2
    if [ ${OS_RELEASE_VERSION} == "18" ];then
        cat > /etc/netplan/01-netcfg.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    elif [ ${OS_RELEASE_VERSION} == "20" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    elif [ ${OS_RELEASE_VERSION} == "22" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    else
        cat > /etc/netplan/50-cloud-init.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_dual_debian_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    while true; do
        read -p "请输入第一块网卡IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX2
    sed -ri -e "s/allow-hotplug ${ETHNAME}/auto eth0/g" -e "s/(iface) ${ETHNAME} (inet) dhcp/\1 eth0 \2 static/g" /etc/network/interfaces
    cat >> /etc/network/interfaces <<-EOF
address ${IP}/${PREFIX}
gateway ${GATEWAY}
dns-nameservers ${PRIMARY_DNS} ${BACKUP_DNS}

auto eth1
iface eth1 inet static
address ${IP2}/${PREFIX2}
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_dual_ip(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        set_dual_rocky_almalinux_centos_ip
    elif [ ${OS_ID} == "Ubuntu" ];then
        set_dual_ubuntu_ip
    else
        set_dual_debian_ip
    fi
}

set_hostname(){
    read -p "请输入主机名: " HOST
    hostnamectl set-hostname ${HOST}
    ${COLOR}"${OS_ID} ${OS_RELEASE} 主机名设置成功,请重新登录生效!"${END}
}

aliyun(){
    MIRROR=mirrors.aliyun.com
}

huawei(){
    MIRROR=repo.huaweicloud.com
}

tencent(){
    MIRROR=mirrors.tencent.com
}

tuna(){
    MIRROR=mirrors.tuna.tsinghua.edu.cn
}

netease(){
    MIRROR=mirrors.163.com
}

sohu(){
    MIRROR=mirrors.sohu.com
}

nju(){
    MIRROR=mirrors.nju.edu.cn
}

ustc(){
    MIRROR=mirrors.ustc.edu.cn
}

sjtu(){
    MIRROR=mirrors.sjtug.sjtu.edu.cn
}

xjtu(){
    MIRROR=mirrors.xjtu.edu.cn
}

bfsu(){
    MIRROR=mirrors.bfsu.edu.cn
}

bjtu(){
    MIRROR=mirror.bjtu.edu.cn
}

pku(){
    MIRROR=mirrors.pku.edu.cn
}

archive_fedora(){
    MIRROR=archives.fedoraproject.org
}

set_yum_rocky8_9(){
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\1@p' /etc/yum.repos.d/[Rr]ocky*.repo | head -1)
    OLD_DIR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\2@p' /etc/yum.repos.d/[Rr]ocky*.repo | head -1)
    if [ ${MIRROR_URL} == "aliyun" -o ${MIRROR_URL} == "xjtu" ];then
        if [ ${OLD_DIR} == '$contentdir' ];then
            sed -i.bak -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://'${MIRROR}'/rockylinux|g' /etc/yum.repos.d/[Rr]ocky*.repo
        elif [ ${OLD_DIR} == 'rocky' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/rocky|baseurl=https://'${MIRROR}'/rockylinux|g' /etc/yum.repos.d/[Rr]ocky*.repo
        elif [ ${OLD_DIR} == 'Rocky' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/Rocky|baseurl=https://'${MIRROR}'/rockylinux|g' /etc/yum.repos.d/[Rr]ocky*.repo
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/rockylinux|baseurl=https://'${MIRROR}'/rockylinux|g' /etc/yum.repos.d/[Rr]ocky*.repo
        fi
    elif [ ${MIRROR_URL} == "sohu" ];then
        if [ ${OLD_DIR} == '$contentdir' ];then
            sed -i.bak -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://'${OLD_MIRROR}'/$contentdir|baseurl=https://'${MIRROR}'/Rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
        elif [ ${OLD_DIR} == 'rockylinux' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/rockylinux|baseurl=https://'${MIRROR}'/Rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
        elif [ ${OLD_DIR} == 'rocky' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/rocky|baseurl=https://'${MIRROR}'/Rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo 
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/Rocky|baseurl=https://'${MIRROR}'/Rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
        fi	
    else
        if [ ${OLD_DIR} == '$contentdir' ];then
            sed -i.bak -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://'${OLD_MIRROR}'/$contentdir|baseurl=https://'${MIRROR}'/rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
        elif [ ${OLD_DIR} == 'rockylinux' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/rockylinux|baseurl=https://'${MIRROR}'/rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
        elif [ ${OLD_DIR} == 'Rocky' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/Rocky|baseurl=https://'${MIRROR}'/rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo 
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/rocky|baseurl=https://'${MIRROR}'/rocky|g' /etc/yum.repos.d/[Rr]ocky*.repo
        fi
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

rocky8_9_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)网易镜像源
4)搜狐镜像源
5)南京大学镜像源
6)中科大镜像源
7)上海交通大学镜像源
8)西安交通大学镜像源
9)北京大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_rocky8_9
            ;;
        2)
            tencent
            set_yum_rocky8_9
            ;;
        3)
            netease
            set_yum_rocky8_9
            ;;
        4)
            sohu
            set_yum_rocky8_9
            ;;
        5)
            nju
            set_yum_rocky8_9
            ;;
        6)
            ustc
            set_yum_rocky8_9
            ;;
        7)
            sjtu
            set_yum_rocky8_9
            ;;
        8)
            xjtu
            set_yum_rocky8_9
            ;;
        9)
            pku
            set_yum_rocky8_9
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_devel_rocky9(){
    dnf config-manager --set-enabled devel
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} devel源设置完成!"${END}
}

set_powertools_rocky_almalinux_centos8(){
    dnf config-manager --set-enabled powertools
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} powertools源设置完成!"${END}
}

set_yum_almalinux8_9(){
    OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever/.*/$@\1@p' /etc/yum.repos.d/almalinux*.repo | head -1)
    sed -i.bak -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^# baseurl=https://'${OLD_MIRROR}'|baseurl=https://'${MIRROR}'|g' /etc/yum.repos.d/almalinux*.repo
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

almalinux8_9_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)南京大学镜像源
4)上海交通大学镜像源
5)北京大学镜像源
6)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-6): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_almalinux8_9
            ;;
        2)
            tencent
            set_yum_almalinux8_9
            ;;
        3)
            nju
            set_yum_almalinux8_9
            ;;
        4)
            sjtu
            set_yum_almalinux8_9
            ;;
        5)
            pku
            set_yum_almalinux8_9
            ;;
        6)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-6)!"${END}
            ;;
        esac
    done
}

set_yum_centos_stream9_perl(){
    ${COLOR}"由于CentOS Stream 9系统默认镜像源是Perl语言实现的,在更改镜像源之前先确保把'update_mirror.pl'文件和reset脚本放在同一个目录下,否则后面程序会退出,默认的CentOS Stream 9镜像源设置的是阿里云,要修改镜像源,请去'update_mirror.pl'文件里修改url变量!"${END}
    sleep 10
    PERL_FILE=update_mirror.pl
    if [ ! -e ${PERL_FILE} ];then
        ${COLOR}"缺少${PERL_FILE}文件"${END}
        exit
    else
        ${COLOR}"${PERL_FILE}文件已准备好,继续后续配置!"${END}       
    fi
    rpm -q perl &> /dev/null || { ${COLOR}"安装perl工具,请稍等..."${END};yum -y install perl &> /dev/null; }
    perl ./update_mirror.pl /etc/yum.repos.d/centos*.repo
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

set_yum_centos_stream9(){
    OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$releasever-stream/.*/$@\1@p' /etc/yum.repos.d/centos*.repo | head -1)
    sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'|baseurl=https://'${MIRROR}'|g' /etc/yum.repos.d/centos*.repo
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

centos_stream9_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_centos_stream9
            ;;
        2)
            huawei
            set_yum_centos_stream9
            ;;
        3)
            tencent
            set_yum_centos_stream9
            ;;
        4)
            tuna
            set_yum_centos_stream9
            ;;
        5)
            nju
            set_yum_centos_stream9
            ;;
        6)
            ustc
            set_yum_centos_stream9
            ;;
        7)
            bfsu
            set_yum_centos_stream9
            ;;
        8)
            pku
            set_yum_centos_stream9
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_crb_almalinux_centos9(){
    dnf config-manager --set-enabled crb
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} crb源设置完成!"${END}
}

set_yum_centos_stream8(){
    OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$stream/.*/$@\1@p' /etc/yum.repos.d/CentOS-*.repo | head -1)
    OLD_DIR=$(sed -rn '/^.*baseurl=/s@.*=http.*://(.*)/(.*)/\$stream/.*/$@\2@p' /etc/yum.repos.d/CentOS-*.repo | head -1)
    if [ ${OLD_DIR} == '$contentdir' ];then
        sed -i.bak -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/$contentdir|baseurl=https://'${MIRROR}'/centos-vault|g' /etc/yum.repos.d/CentOS-*.repo
    else
        sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'|baseurl=https://'${MIRROR}'|g' /etc/yum.repos.d/CentOS-*.repo
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

centos_stream8_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_centos_stream8
            ;;
        2)
            huawei
            set_yum_centos_stream8
            ;;
        3)
            tencent
            set_yum_centos_stream8
            ;;
        4)
            tuna
            set_yum_centos_stream8
            ;;
        5)
            nju
            set_yum_centos_stream8
            ;;
        6)
            ustc
            set_yum_centos_stream8
            ;;
        7)
            bfsu
            set_yum_centos_stream8
            ;;
        8)
            pku
            set_yum_centos_stream8
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_epel_rocky_almalinux_centos8_9(){
    rpm -q epel-release &> /dev/null || { ${COLOR}"安装epel-release工具,请稍等..."${END};yum -y install epel-release &> /dev/null; }
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    OLD_MIRROR=$(awk -F'/' '/^baseurl=/{print $3}' /etc/yum.repos.d/epel*.repo | head -1)
    OLD_DIR=$(awk -F'/' '/^baseurl=/{print $4}' /etc/yum.repos.d/epel*.repo | head -1)
    if [ ${MIRROR_URL} == "sohu" ];then
        if grep -Eqi "^#baseurl" /etc/yum.repos.d/epel*.repo;then
            sed -i.bak -e 's|^metalink=|#metalink=|g' -e 's|^#baseurl=https://download.example/pub/epel|baseurl=https://'${MIRROR}'/fedora-epel|g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'epel' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/epel|baseurl=https://'${MIRROR}'/fedora-epel|g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'fedora' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/fedora/epel|baseurl=https://'${MIRROR}'/fedora-epel|g' /etc/yum.repos.d/epel*.repo
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/fedora-epel|baseurl=https://'${MIRROR}'/fedora-epel|g' /etc/yum.repos.d/epel*.repo
        fi
    elif [ ${MIRROR_URL} == "sjtu" ];then
        if grep -Eqi "^#baseurl" /etc/yum.repos.d/epel*.repo;then
            sed -i.bak -e 's|^metalink=|#metalink=|g' -e 's|^#baseurl=https://download.example/pub/epel|baseurl=https://'${MIRROR}'/fedora/epel|g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'epel' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/epel|baseurl=https://'${MIRROR}'/fedora/epel|g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'fedora-epel' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/fedora-epel|baseurl=https://'${MIRROR}'/fedora/epel|g' /etc/yum.repos.d/epel*.repo
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/fedora/epel|baseurl=https://'${MIRROR}'/fedora/epel|g' /etc/yum.repos.d/epel*.repo
        fi
    else
        if grep -Eqi "^#baseurl" /etc/yum.repos.d/epel*.repo;then
	        sed -i.bak -e 's|^metalink=|#metalink=|g' -e 's|^#baseurl=https://download.example/pub/epel|baseurl=https://'${MIRROR}'/epel|g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'fedora' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/fedora/epel|baseurl=https://'${MIRROR}'/epel|g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'fedora-epel' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/fedora-epel|baseurl=https://'${MIRROR}'/epel|g' /etc/yum.repos.d/epel*.repo
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/epel|baseurl=https://'${MIRROR}'/epel|g' /etc/yum.repos.d/epel*.repo
        fi
    fi
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "CentOS" ];then
        if [ ${OS_RELEASE_VERSION} == "9" ];then
            dnf config-manager --set-disabled epel-cisco-openh264
        fi
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} EPEL源设置完成!"${END}
}

rocky_almalinux_centos8_9_epel_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)搜狐镜像源
6)南京大学镜像源
7)中科大镜像源
8)上海交通大学镜像源
9)西安交通大学镜像源
9)北京外国语大学镜像源
11)北京大学镜像源
12)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-12): " NUM
        case ${NUM} in
        1)
            aliyun
            set_epel_rocky_almalinux_centos8_9
            ;;
        2)
            huawei
            set_epel_rocky_almalinux_centos8_9
            ;;
        3)
            tencent
            set_epel_rocky_almalinux_centos8_9
            ;;
        4)
            tuna
            set_epel_rocky_almalinux_centos8_9
            ;;
        5)
            sohu
            set_epel_rocky_almalinux_centos8_9
            ;;
        6)
            nju
            set_epel_rocky_almalinux_centos8_9
            ;;
        7)
            ustc
            set_epel_rocky_almalinux_centos8_9
            ;;
        8)
            sjtu
            set_epel_rocky_almalinux_centos8_9
            ;;
        9)
            xjtu
            set_epel_rocky_almalinux_centos8_9
            ;;
        10)
            bfsu
            set_epel_rocky_almalinux_centos8_9
            ;;
        11)
            pku
            set_epel_rocky_almalinux_centos8_9
            ;;
        12)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-12)!"${END}
            ;;
        esac
    done
}

set_yum_centos7(){
    OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=(http.*)://(.*)/(.*)/\$releasever/.*/$@\2@p' /etc/yum.repos.d/CentOS-*.repo | head -1)
    OS_RELEASE_FULL_VERSION=`cat /etc/centos-release | sed -rn 's/^(CentOS Linux release )(.*)( \(Core\))/\2/p'`
    if grep -Eqi "^#baseurl" /etc/yum.repos.d/CentOS-*.repo;then
        sed -i.bak -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://'${MIRROR}'/centos-vault|g' -e "s/\$releasever/${OS_RELEASE_FULL_VERSION}/g" /etc/yum.repos.d/CentOS-*.repo
    else
        sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'|baseurl=https://'${MIRROR}'|g' /etc/yum.repos.d/CentOS-*.repo
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    yum clean all &> /dev/null && yum makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

centos7_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_centos7
            ;;
        2)
            huawei
            set_yum_centos7
            ;;
        3)
            tencent
            set_yum_centos7
            ;;
        4)
            tuna
            set_yum_centos7
            ;;
        5)
            nju
            set_yum_centos7
            ;;
        6)
            ustc
            set_yum_centos7
            ;;
        7)
            bfsu
            set_yum_centos7
            ;;
        8)
            pku
            set_yum_centos7
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_epel_centos7(){
    rpm -q epel-release &> /dev/null || { ${COLOR}"安装epel-release工具,请稍等..."${END};yum -y install epel-release &> /dev/null; }
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    OLD_MIRROR=$(awk -F'/' '/^baseurl=/{print $3}' /etc/yum.repos.d/epel*.repo | head -1)
    OLD_DIR=$(awk -F'/' '/^baseurl=/{print $4}' /etc/yum.repos.d/epel*.repo | head -1)
    if [ ${MIRROR_URL} == "aliyun" -o ${MIRROR_URL} == "tencent" ];then
        if grep -Eqi "^#baseurl" /etc/yum.repos.d/epel*.repo;then
	        sed -i.bak -e 's!^metalink=!#metalink=!g' -e 's!^#baseurl=!baseurl=!g' -e 's!https\?://download\.fedoraproject\.org/pub/epel!https://'${MIRROR}'/epel-archive!g' -e 's!https\?://download\.example/pub/epel!https://'${MIRROR}'/epel!g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'pub' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/pub/archive/epel|baseurl=https://'${MIRROR}'/epel-archive|g' /etc/yum.repos.d/epel*.repo
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/epel-archive|baseurl=https://'${MIRROR}'/epel-archive|g' /etc/yum.repos.d/epel*.repo
        fi
    else
        if grep -Eqi "^#baseurl" /etc/yum.repos.d/epel*.repo;then
	        sed -i.bak -e 's!^metalink=!#metalink=!g' -e 's!^#baseurl=!baseurl=!g' -e 's!https\?://download\.fedoraproject\.org/pub/epel!https://'${MIRROR}'/pub/archive/epel!g' -e 's!https\?://download\.example/pub/epel!https://'${MIRROR}'/epel!g' /etc/yum.repos.d/epel*.repo
        elif [ ${OLD_DIR} == 'epel-archive' ];then
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/epel-archive|baseurl=https://'${MIRROR}'/pub/archive/epel|g' /etc/yum.repos.d/epel*.repo
        else
            sed -i -e 's|^baseurl=https://'${OLD_MIRROR}'/pub/archive/epel|baseurl=https://'${MIRROR}'/pub/archive/epel|g' /etc/yum.repos.d/epel*.repo
        fi
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} EPEL源设置完成!"${END}
}

centos7_epel_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)fedora镜像源
4)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-4): " NUM
        case ${NUM} in
        1)
            aliyun
            set_epel_centos7
            ;;
        2)
            tencent
            set_epel_centos7
            ;;
        3)
            archive_fedora
            set_epel_centos7
            ;;
        4)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-4)!"${END}
            ;;
        esac
    done
}

rocky_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)base仓库
2)epel仓库
3)启用Rocky 9 devel仓库
4)启用Rocky 8 PowerTools仓库
5)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-5): " NUM
        case ${NUM} in
        1)
            rocky8_9_base_menu
            ;;
        2)
            rocky_almalinux_centos8_9_epel_menu
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                set_devel_rocky9
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有devel源,不用设置!"${END}
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                set_powertools_rocky_almalinux_centos8
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有powertools源,不用设置!"${END}
            fi
            ;;
        5)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-5)!"${END}
            ;;
        esac
    done
}

almalinux_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)base仓库
2)epel仓库
3)启用AlmaLinux 9 crb仓库
4)启用AlmaLinux 8 PowerTools仓库
5)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-5): " NUM
        case ${NUM} in
        1)
            almalinux8_9_base_menu
            ;;
        2)
            rocky_almalinux_centos8_9_epel_menu
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                set_crb_almalinux_centos9
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有crb源,不用设置!"${END}
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                set_powertools_rocky_almalinux_centos8
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有powertools源,不用设置!"${END}
            fi
            ;;
        5)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-5)!"${END}
            ;;
        esac
    done
}

centos_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)base仓库
2)epel仓库
3)启用CentOS Stream 9 crb仓库
4)启用CentOS Stream 8 PowerTools仓库
5)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-5): " NUM
        case ${NUM} in
        1)
            if [ ${OS_NAME} == "Stream" ];then
                if [ ${OS_RELEASE_VERSION} == "8" ];then
                    centos_stream8_base_menu
                else
                    if grep -Eqi "^baseurl" /etc/yum.repos.d/centos*.repo;then
                        centos_stream9_base_menu
                    else
                        set_yum_centos_stream9_perl
                    fi
                fi
            else
                centos7_base_menu
            fi
            ;;
        2)
            if [ ${OS_RELEASE_VERSION} == "7" ];then
                centos7_epel_menu
            else
                rocky_almalinux_centos8_9_epel_menu
            fi
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                set_crb_almalinux_centos9
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有crb源,不用设置!"${END}
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                set_powertools_rocky_almalinux_centos8
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有powertools源,不用设置!"${END}
            fi
            ;;
        5)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-5)!"${END}
            ;;
        esac
    done
}

set_ubuntu_apt(){
    if [ ${OS_RELEASE_VERSION} == "18" -o ${OS_RELEASE_VERSION} == "20" -o ${OS_RELEASE_VERSION} == "22" ];then
        OLD_MIRROR=`sed -rn "s@^deb http(.*)://(.*)/ubuntu/? $(lsb_release -cs) main.*@\2@p" /etc/apt/sources.list`
        sed -i.bak 's/'${OLD_MIRROR}'/'${MIRROR}'/g' /etc/apt/sources.list
        if [ ${OS_RELEASE_VERSION} == "18" ];then
	        SECURITY_MIRROR=`sed -rn "s@^deb http(.*)://(.*)/ubuntu $(lsb_release -cs)-security main.*@\2@p" /etc/apt/sources.list`
            sed -i.bak 's/'${SECURITY_MIRROR}'/'${MIRROR}'/g' /etc/apt/sources.list
        fi
    else
        sed -ri "s@^(URIs: )(http.*://)(.*)(/ubuntu).?@\1https://${MIRROR}\4@g" /etc/apt/sources.list.d/ubuntu.sources
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    apt update &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} APT源设置完成!"${END}
}

apt_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)网易镜像源
6)搜狐镜像源
7)南京大学镜像源
8)中科大镜像源
9)上海交通大学镜像源
10)西安交通大学镜像源
11)北京外国语大学镜像源
12)北京交通大学镜像源
13)北京大学镜像源
14)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-14): " NUM
        case ${NUM} in
        1)
            aliyun
            set_ubuntu_apt
            ;;
        2)
            huawei
            set_ubuntu_apt
            ;;
        3)
            tencent
            set_ubuntu_apt
            ;;
        4)
            tuna
            set_ubuntu_apt
            ;;
        5)
            netease
            set_ubuntu_apt
            ;;
        6)
            sohu
            set_ubuntu_apt
            ;;
        7)
            nju
            set_ubuntu_apt
            ;;
        8)
            ustc
            set_ubuntu_apt
            ;;
        9)
            sjtu
            set_ubuntu_apt
            ;;
        10)
            xjtu
            set_ubuntu_apt
            ;;
        11)
            bfsu
            set_ubuntu_apt
            ;;
        12)
            bjtu
            set_ubuntu_apt
            ;;
        13)
            pku
            set_ubuntu_apt
            ;;
        14)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-14)!"${END}
            ;;
        esac
    done
}

set_debian_apt(){
    OLD_MIRROR=`sed -rn "s@^deb http(.*)://(.*)/debian/? $(lsb_release -cs) main.*@\2@p" /etc/apt/sources.list`
    SECURITY_MIRROR=`sed -rn "s@^deb http(.*)://(.*)/debian-security $(lsb_release -cs)-security main.*@\2@p" /etc/apt/sources.list`
    sed -ri.bak -e 's/'${OLD_MIRROR}'/'${MIRROR}'/g' -e 's/'${SECURITY_MIRROR}'/'${MIRROR}'/g' -e 's/^(deb cdrom.*)/#\1/g' /etc/apt/sources.list
    ${COLOR}"更新镜像源中,请稍等..."${END}
    apt update &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} APT源设置完成!"${END}
}

debian_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)网易镜像源
6)搜狐镜像源
7)南京大学镜像源
8)中科大镜像源
9)上海交通大学镜像源
10)西安交通大学镜像源
11)北京外国语大学镜像源
12)北京交通大学镜像源
13)北京大学镜像源
14)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-14): " NUM
        case ${NUM} in
        1)
            aliyun
            set_debian_apt
            ;;
        2)
            huawei
            set_debian_apt
            ;;
        3)
            tencent
            set_debian_apt
            ;;
        4)
            tuna
            set_debian_apt
            ;;
        5)
            netease
            set_debian_apt
            ;;
        6)
            sohu
            set_debian_apt
            ;;
        7)
            nju
            set_debian_apt
            ;;
        8)
            ustc
            set_debian_apt
            ;;
        9)
            sjtu
            set_debian_apt
            ;;
        10)
            xjtu
            set_debian_apt
            ;;
        11)
            bfsu
            set_debian_apt
            ;;
        12)
            bjtu
            set_debian_apt
            ;;
        13)
            pku
            set_debian_apt
            ;;
        14)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-14)!"${END}
            ;;
        esac
    done
}

set_mirror_repository(){
    if [ ${OS_ID} == "Rocky" ];then
        rocky_menu
    elif [ ${OS_ID} == "AlmaLinux" ];then
        almalinux_menu
    elif [ ${OS_ID} == "CentOS" ];then
        centos_menu
    elif [ ${OS_ID} == "Ubuntu" ];then
        apt_menu
    else
        debian_menu
    fi
}

rocky_almalinux_centos_minimal_install(){
    ${COLOR}'开始安装“Minimal安装建议安装软件包”,请稍等......'${END}
    yum -y install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} Minimal安装建议安装软件包已安装完成!"${END}
}

ubuntu_debian_minimal_install(){
    ${COLOR}'开始安装“Minimal安装建议安装软件包”,请稍等......'${END}
    apt -y install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev gcc openssh-server iotop unzip zip
    ${COLOR}"${OS_ID} ${OS_RELEASE} Minimal安装建议安装软件包已安装完成!"${END}
}

minimal_install(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        rocky_almalinux_centos_minimal_install
    else
        ubuntu_debian_minimal_install
    fi
}

disable_firewall(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        rpm -q firewalld &> /dev/null && { systemctl disable --now firewalld &> /dev/null; ${COLOR}"${OS_ID} ${OS_RELEASE} Firewall防火墙已关闭!"${END}; } || ${COLOR}"${OS_ID} ${OS_RELEASE} iptables防火墙已关闭!"${END}
    elif [ ${OS_ID} == "Ubuntu" ];then
        dpkg -s ufw &> /dev/null && { systemctl disable --now ufw &> /dev/null; ${COLOR}"${OS_ID} ${OS_RELEASE} ufw防火墙已关闭!"${END}; } || ${COLOR}"${OS_ID} ${OS_RELEASE}  没有ufw防火墙服务,不用关闭!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE}  没有安装防火墙服务,不用关闭!"${END}
    fi
}

disable_selinux(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        if [ `getenforce` == "Enforcing" ];then
            sed -ri.bak 's/^(SELINUX=).*/\1disabled/' /etc/selinux/config
            ${COLOR}"${OS_ID} ${OS_RELEASE} SELinux已禁用,请重新启动系统后才能生效!"${END}
        else
            ${COLOR}"${OS_ID} ${OS_RELEASE} SELinux已被禁用,不用设置!"${END}
        fi
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} SELinux默认没有安装,不用设置!"${END}
    fi
}

set_swap(){
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 20 -o ${OS_RELEASE_VERSION} == 22 -o ${OS_RELEASE_VERSION} == 24 ];then
            SD_NAME=`lsblk|awk -F"[ └─]" '/SWAP/{printf $3}'`
            systemctl mask dev-${SD_NAME}.swap &> /dev/null
        fi
    fi
    swapoff -a
    ${COLOR}"${OS_ID} ${OS_RELEASE} 禁用swap成功!"${END}
}

set_localtime(){
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo 'Asia/Shanghai' >/etc/timezone
    if [ ${OS_ID} == "Ubuntu" ];then
        cat >> /etc/default/locale <<-EOF
LC_TIME=en_DK.UTF-8
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统时区已设置成功,请重启系统后生效!"${END}
}

set_limits(){
    cat >> /etc/security/limits.conf <<-EOF
root     soft   core     unlimited
root     hard   core     unlimited
root     soft   nproc    1000000
root     hard   nproc    1000000
root     soft   nofile   1000000
root     hard   nofile   1000000
root     soft   memlock  32000
root     hard   memlock  32000
root     soft   msgqueue 8192000
root     hard   msgqueue 8192000
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 优化资源限制参数成功!"${END}
}

set_kernel(){
    modprobe  br_netfilter
    cat > /etc/sysctl.conf <<-EOF
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

# TCP kernel paramater
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1

# socket buffer
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 20480
net.core.optmem_max = 81920

# TCP conn
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15

# tcp conn reuse
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syncookies = 1

# keepalive conn
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 10001    65000

# swap
vm.overcommit_memory = 0
vm.swappiness = 10

#net.ipv4.conf.eth1.rp_filter = 0
#net.ipv4.conf.lo.arp_ignore = 1
#net.ipv4.conf.lo.arp_announce = 2
#net.ipv4.conf.all.arp_ignore = 1
#net.ipv4.conf.all.arp_announce = 2
EOF
    MAIN_KERNEL=`uname -r | cut -d. -f1`
    SUB_KERNEL=`uname -r | cut -d. -f2`
    if [ ${MAIN_KERNEL} -lt "4" -a ${SUB_KERNEL} -lt "12" ];then
    cat >> /etc/sysctl.conf <<-EOF	
net.ipv4.tcp_tw_recycle = 0
EOF
    fi
    sysctl -p &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} 优化内核参数成功!"${END}
}

optimization_sshd(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        sed -ri.bak -e 's/^#(UseDNS).*/\1 no/' -e 's/^(GSSAPIAuthentication).*/\1 no/' /etc/ssh/sshd_config
    else
        sed -ri.bak -e 's/^#(UseDNS).*/\1 no/' -e 's/^#(GSSAPIAuthentication).*/\1 no/' /etc/ssh/sshd_config
    fi
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 24 ];then
            systemctl restart ssh
        fi
    else
        systemctl restart sshd
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} SSH已优化完成!"${END}
}

set_sshd_port(){
    disable_selinux
    disable_firewall
    read -p "请输入端口号: " PORT
    sed -i 's/#Port 22/Port '${PORT}'/' /etc/ssh/sshd_config
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 24 ];then
            systemctl restart ssh
        fi
    else
        systemctl restart sshd
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 更改SSH端口号已完成,请重新登陆后生效!"${END}
}

set_rocky_almalinux_centos_alias(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    ETHNAME2=`ip addr | awk -F"[ :]" '/^3/{print $3}'`
    read -p "请输入网卡数量(仅支持1个和2个网卡,输入1或2): " IP_NUM
    if [ ${IP_NUM} == "1" ];then
        if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/sysconfig/network-scripts"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/sysconfig/network-scripts/ifcfg-${ETHNAME}"
EOF
        else
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/NetworkManager/system-connections"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection"
EOF
        fi
    else	
        if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/sysconfig/network-scripts"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/sysconfig/network-scripts/ifcfg-${ETHNAME}"
alias vie1="vim /etc/sysconfig/network-scripts/ifcfg-${ETHNAME2}"
EOF
        else
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/NetworkManager/system-connections"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection"
alias vie1="vim /etc/NetworkManager/system-connections/${ETHNAME2}.nmconnection"
EOF
        fi
    fi
    DISK_NAME=`lsblk|awk -F" " '/disk/{printf $1}' | cut -c1-4`
    if [ ${DISK_NAME} == "sda" ];then
        cat >>~/.bashrc <<-EOF
alias scandisk="echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan"
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统别名已设置成功,请重新登陆后生效!"${END}
}

set_ubuntu_alias(){
    cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/netplan"
alias cdapt="cd /etc/apt"
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统别名已设置成功,请重新登陆后生效!"${END}
}

set_debian_alias(){
    cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/network"
alias cdapt="cd /etc/apt"
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统别名已设置成功,请重新登陆后生效!"${END}
}

set_alias(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        if grep -Eqi "(.*cdnet|.*cdrepo|.*vie0|.*vie1|.*scandisk)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d'  -e '/.*cdrepo/d' -e '/.*vie0/d' -e '/.*vie1/d' -e '/.*scandisk/d' ~/.bashrc
            set_rocky_almalinux_centos_alias
        else
            set_rocky_almalinux_centos_alias
        fi
    elif [ ${OS_ID} == "Ubuntu" ];then
        if grep -Eqi "(.*cdnet|.*cdapt)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d' -e '/.*cdapt/d' ~/.bashrc
            set_ubuntu_alias
        else
            set_ubuntu_alias
        fi
    else
        if grep -Eqi "(.*cdnet|.*cdapt)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d' -e '/.*cdapt/d' ~/.bashrc
            set_debian_alias
        else
            set_debian_alias
        fi
    fi
}

set_vimrc(){
    read -p "请输入作者名: " AUTHOR
    read -p "请输入QQ号: " QQ
    read -p "请输入网址: " V_MIRROR
    cat >~/.vimrc <<-EOF
set ts=4
set expandtab
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
    if expand("%:e") == 'sh'
    call setline(1,"#!/bin/bash")
    call setline(2,"#")
    call setline(3,"#**********************************************************************************************")
    call setline(4,"#Author:        ${AUTHOR}")
    call setline(5,"#QQ:            ${QQ}")
    call setline(6,"#Date:          ".strftime("%Y-%m-%d"))
    call setline(7,"#FileName:      ".expand("%"))
    call setline(8,"#MIRROR:           ${V_MIRROR}")
    call setline(9,"#Description:   The test script")
    call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
    call setline(11,"#*********************************************************************************************")
    call setline(12,"")
    endif
endfunc
autocmd BufNewFile * normal G
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} vimrc设置完成,请重新系统启动才能生效!"${END}
}

set_mail(){                                                                                                 
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        rpm -q postfix &> /dev/null || { yum -y install postfix &> /dev/null; systemctl enable --now postfix &> /dev/null; }
        rpm -q mailx &> /dev/null || yum -y install mailx &> /dev/null
    else
        dpkg -s mailutils &> /dev/null || apt -y install mailutils
    fi
    read -p "请输入邮箱地址: " MAIL
    read -p "请输入邮箱授权码: " AUTH
    SMTP=`echo ${MAIL} |awk -F"@" '{print $2}'`
    cat >~/.mailrc <<-EOF
set from=${MAIL}
set smtp=smtp.${SMTP}
set smtp-auth-user=${MAIL}
set smtp-auth-password=${AUTH}
set smtp-auth=login
set ssl-verify=ignore
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 邮件设置完成,请重新登录后才能生效!"${END}
}

red(){
    P_COLOR=31
}

green(){
    P_COLOR=32
}

yellow(){
    P_COLOR=33
}

blue(){
    P_COLOR=34
}

violet(){
    P_COLOR=35
}

cyan_blue(){
    P_COLOR=36
}

random_color(){
    P_COLOR="$[RANDOM%7+31]"
}

rocky_almalinux_centos_ps1(){
    C_PS1=$(echo "PS1='\[\e[1;${P_COLOR}m\][\u@\h \W]\\$ \[\e[0m\]'" >> ~/.bashrc)
}

ubuntu_debian_ps1(){
    U_PS1=$(echo 'PS1="\[\e[1;'''${P_COLOR}'''m\]${debian_chroot:+($debian_chroot)}\u@\h:\w\\$ \[\e[0m\]"' >> ~/.bashrc)
}

set_ps1_env(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            rocky_almalinux_centos_ps1
        else
            rocky_almalinux_centos_ps1
        fi
    else
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            ubuntu_debian_ps1
        else
            ubuntu_debian_ps1
        fi
    fi
}

set_ps1(){
    TIPS="${COLOR}${OS_ID} ${OS_RELEASE} PS1设置成功,请重新登录生效!${END}"
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)31 红色
2)32 绿色
3)33 黄色
4)34 蓝色
5)35 紫色
6)36 青色
7)随机颜色
8)退出
EOF
        echo -e '\E[0m'

        read -p "请输入颜色编号(1-8): " NUM
        case ${NUM} in
        1)
            red
            set_ps1_env
            ${TIPS}
            ;;
        2)
            green
            set_ps1_env
            ${TIPS}
            ;;
        3)
            yellow
            set_ps1_env
            ${TIPS}
            ;;
        4)
            blue
            set_ps1_env
            ${TIPS}
            ;;
        5)
            violet
            set_ps1_env
            ${TIPS}
            ;;
        6)
            cyan_blue
            set_ps1_env
            ${TIPS}
            ;;
        7)
            random_color
            set_ps1_env
            ${TIPS}
            ;;
        8)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-8)!"${END}
            ;;
        esac
    done
}

set_vim(){
    echo "export EDITOR=vim" >> ~/.bashrc
}

set_vim_env(){
    if grep -Eqi ".*EDITOR" ~/.bashrc;then
        sed -i '/.*EDITOR/d' ~/.bashrc
        set_vim
    else
        set_vim
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 默认文本编辑器设置成功,请重新登录生效!"${END}
}

set_history(){
    echo 'export HISTTIMEFORMAT="%F %T "' >> ~/.bashrc 
}

set_history_env(){
    if grep -Eqi ".*HISTTIMEFORMAT" ~/.bashrc;then
        sed -i '/.*HISTTIMEFORMAT/d' ~/.bashrc
        set_history
    else
        set_history
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} history格式设置成功,请重新登录生效!"${END}
}

disable_restart(){
    if [ -f /usr/lib/systemd/system/ctrl-alt-del.target ];then
        cp /usr/lib/systemd/system/ctrl-alt-del.target{,.bak}
        rm -f /usr/lib/systemd/system/ctrl-alt-del.target
        ${COLOR}"${OS_ID} ${OS_RELEASE} 禁用ctrl+alt+del重启处理成功!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 禁用ctrl+alt+del已处理!"${END}
    fi
}

set_ubuntu_debian_root_login(){
    if [ ${OS_ID} == "Ubuntu" -o ${OS_ID} == "Debian" ];then
        read -p "请输入密码: " PASSWORD
        echo ${PASSWORD} |sudo -S sed -ri 's@#(PermitRootLogin )prohibit-password@\1yes@' /etc/ssh/sshd_config
        if [ ${OS_ID} == "Ubuntu" ];then
            if [ ${OS_RELEASE_VERSION} == 24 ];then
                sudo systemctl restart ssh
	        fi
        else
            sudo systemctl restart sshd
        fi
        sudo -S passwd root <<-EOF
${PASSWORD}
${PASSWORD}
EOF
        ${COLOR}"${OS_ID} ${OS_RELEASE} root用户登录已设置完成,请重新登录后生效!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 系统不可用!"${END}
    fi
}

ubuntu_remove(){
    if [ ${OS_ID} == "Ubuntu" ];then
        apt -y purge ufw lxd lxd-client lxcfs liblxc-common
        ${COLOR}"${OS_ID} ${OS_RELEASE} 无用软件包卸载完成!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 系统不可用!"${END}
    fi
}

ubuntu_20_22_24_remove_snap(){
    dpkg -s snapd &> /dev/null
    if [ $? -eq 1 ];then 
        ${COLOR}"${OS_ID} ${OS_RELEASE} snap已卸载!"${END}
    else
        systemctl disable snapd.service && systemctl disable snapd.socket && systemctl disable snapd.seeded.service
    
        sum=$(snap list | awk 'NR>=2{print $1}' | wc -l)
        while [ $sum -ne 0 ];do
            for p in $(snap list | awk 'NR>=2{print $1}'); do
                snap remove --purge $p
            done
            sum=$(snap list | awk 'NR>=2{print $1}' | wc -l)
        done
        
        apt -y autoremove --purge snapd
        
        rm -rf ~/snap && sudo rm -rf /snap && rm -rf /var/snap && rm -rf /var/lib/snapd && rm -rf /var/cache/snapd
        
        cat > /etc/apt/preferences.d/no-snapd.pref << EOF
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOF
        apt update
        ${COLOR}"${OS_ID} ${OS_RELEASE} snap卸载完成!"${END}
    fi
}

ubuntu_remove_snap(){
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 20 -o ${OS_RELEASE_VERSION} == 22 -o ${OS_RELEASE_VERSION} == 24 ];then
            ubuntu_20_22_24_remove_snap
        else
           ${COLOR}"${OS_ID} ${OS_RELEASE} 默认没有安装snap!"${END} 
        fi
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 系统不可用!"${END}
    fi
}

menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
**********************************************************************
*                           初始化脚本菜单                           *
* 1.修改网卡名                     15.设置系统别名                   *
* 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
* 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
* 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
* 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
* 6.Minimal安装建议安装软件        20.设置history格式                *
* 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
* 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
* 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
* 10.设置系统时区                  24.Ubuntu卸载snap                 *
* 11.优化资源限制参数              25.重启系统                       *
* 12.优化内核参数                  26.关机                           *
* 13.优化SSH                       27.退出                           *
* 14.更改SSH端口号                                                   *
**********************************************************************
EOF
        echo -e '\E[0m'

        read -p "请选择相应的编号(1-27): " choice
        case ${choice} in
        1)
            set_eth
            ;;
        2)
            set_ip
            ;;
        3)
            set_dual_ip
            ;;
        4)
            set_hostname
            ;;
        5)
            set_mirror_repository
            ;;
        6)
            minimal_install
            ;;
        7)
            disable_firewall
            ;;
        8)
            disable_selinux
            ;;
        9)
            set_swap
            ;;
        10)
            set_localtime
            ;;
        11)
            set_limits
            ;;
        12)
            set_kernel
            ;;
        13)
            optimization_sshd
            ;;
        14)
            set_sshd_port
            ;;
        15)
            set_alias
            ;;
        16)
            set_vimrc
            ;;
        17)
            set_mail
            ;;
        18)
            set_ps1
            ;;
        19)
            set_vim_env
            ;;
        20)
            set_history_env
            ;;
        21)
            disable_restart
            ;;
        22)
            set_ubuntu_debian_root_login
            ;;
        23)
            ubuntu_remove
            ;;
        24)
            ubuntu_remove_snap
            ;;
        25)
            reboot
            ;;
        26)
            shutdown -h now
            ;;
        27)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-27)!"${END}
            ;;
        esac
    done
}

main(){
    os
    menu
}

main

CentOS Stream 9修改镜像仓库需要下面的perl脚本。

[root@rocky9 ~]# cat update_mirror.pl
#!/usr/bin/perl

use strict;
use warnings;
use autodie;

# 要修改镜像源,请去修改url变量!
my $url = 'mirrors.aliyun.com';
my $mirrors = "https://$url/centos-stream";

if (@ARGV < 1) {
    die "Usage: $0 <filename1> <filename2> ...\n";
}

while (my $filename = shift @ARGV) {
    my $backup_filename = $filename . '.bak';
    rename $filename, $backup_filename;

    open my $input, "<", $backup_filename;
    open my $output, ">", $filename;

    while (<$input>) {
        s/^metalink/# metalink/;

        if (m/^name/) {
            my (undef, $repo, $arch) = split /-/;
            $repo =~ s/^\s+|\s+$//g;
            ($arch = defined $arch ? lc($arch) : '') =~ s/^\s+|\s+$//g;

            if ($repo =~ /^Extras/) {
                $_ .= "baseurl=${mirrors}/SIGs/\$releasever-stream/extras" . ($arch eq 'source' ? "/${arch}/" : "/\$basearch/") . "extras-common\n";
            } else {
                $_ .= "baseurl=${mirrors}/\$releasever-stream/$repo" . ($arch eq 'source' ? "/" : "/\$basearch/") . ($arch ne '' ? "${arch}/tree/" : "os") . "\n";
            }
        }

        print $output $_;
    }
}

下面是reset_v9_2脚本内容:

[root@rocky9 ~]# cat reset_v9_2.sh
#!/bin/bash
#
#**********************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2024-10-31
#FileName:      reset_v9_2.sh
#MIRROR:        raymond.blog.csdn.net
#Description:   The reset linux system initialization script supports 
#               “Rocky Linux 8 and 9, Almalinux 8 and 9, CentOS 7, 
#               CentOS Stream 8 and 9, Ubuntu 18.04, 20.04, 22.04 and 24.04, 
#               Debian 12“ operating systems.
#Copyright (C): 2024 All rights reserved
#**********************************************************************************
COLOR="echo -e \\033[01;31m"
END='\033[0m'

os(){
    OS_ID=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+).*"$@\1@p' /etc/os-release`
    OS_NAME=`sed -rn '/^NAME=/s@.*="([[:alpha:]]+) (.*)"$@\2@p' /etc/os-release`
    OS_RELEASE=`sed -rn '/^VERSION_ID=/s@.*="?([0-9.]+)"?@\1@p' /etc/os-release`
    OS_RELEASE_VERSION=`sed -rn '/^VERSION_ID=/s@.*="?([0-9]+)\.?.*"?@\1@p' /etc/os-release`
}

set_rocky_almalinux_centos_eth(){
    if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
        ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
        if grep -Eqi "(net\.ifnames|biosdevname)" /etc/default/grub;then
            ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名配置文件已修改,不用修改!"${END}
        else
            # 修改网卡名称配置文件
            sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@ net.ifnames=0 biosdevname=0"@' /etc/default/grub
            grub2-mkconfig -o /boot/grub2/grub.cfg >& /dev/null

            # 修改网卡文件名
            mv /etc/sysconfig/network-scripts/ifcfg-${ETHNAME} /etc/sysconfig/network-scripts/ifcfg-eth0
            ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名已修改成功,10秒后,机器会自动重启!"${END}
            sleep 10 && shutdown -r now
        fi   
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 不能修改网卡名!"${END} 
    fi
}

set_ubuntu_debian_eth(){
    #修改网卡名称配置文件
    if grep -Eqi "(net\.ifnames|biosdevname)" /etc/default/grub;then
        ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名配置文件已修改,不用修改!"${END}
    else
        sed -ri.bak '/^GRUB_CMDLINE_LINUX=/s@"$@net.ifnames=0 biosdevname=0"@' /etc/default/grub
        grub-mkconfig -o /boot/grub/grub.cfg >& /dev/null
        ${COLOR}"${OS_ID} ${OS_RELEASE} 网卡名已修改成功,请重新启动系统后才能生效!"${END}
    fi
}

set_eth(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        set_rocky_almalinux_centos_eth
    else
        set_ubuntu_debian_eth
    fi
}

check_ip(){
    local IP=$1
    VALID_CHECK=$(echo ${IP}|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
    if echo ${IP}|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null; then
        if [ ${VALID_CHECK} == "yes" ]; then
            echo "IP ${IP}  available!"
            return 0
        else
            echo "IP ${IP} not available!"
            return 1
        fi
    else
        echo "IP format error!"
        return 1
    fi
}

set_rocky_almalinux_centos_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    CONNECTION_NAME=`nmcli dev | awk 'NR==2{print $4,$5,$6}'`	
    while true; do
        read -p "请输入IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
        nmcli connection modify "${CONNECTION_NAME}" con-name ${ETHNAME}
        cat > /etc/sysconfig/network-scripts/ifcfg-eth0 <<-EOF
NAME=${ETHNAME}
DEVICE=${ETHNAME}
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=${IP}
PREFIX=${PREFIX}
GATEWAY=${GATEWAY}
DNS1=${PRIMARY_DNS}
DNS2=${BACKUP_DNS}
EOF
        ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,10秒后,机器会自动重启!"${END}
	    sleep 10 && shutdown -r now
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请使用新IP重新登录!"${END}
        cat > /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection <<-EOF
[connection]
id=${ETHNAME}
type=ethernet
interface-name=${ETHNAME}

[ethernet]

[ipv4]
address1=${IP}/${PREFIX},${GATEWAY}
dns=${PRIMARY_DNS};${BACKUP_DNS};
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
EOF
    fi
    nmcli con reload && nmcli dev up ${ETHNAME} >& /dev/null
}

set_ubuntu_ip(){
    while true; do
        read -p "请输入IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    if [ ${OS_RELEASE_VERSION} == "18" ];then
        cat > /etc/netplan/01-netcfg.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    elif [ ${OS_RELEASE_VERSION} == "20" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    elif [ ${OS_RELEASE_VERSION} == "22" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    else
        cat > /etc/netplan/50-cloud-init.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
EOF
    fi    
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}   
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_debian_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    while true; do
        read -p "请输入IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    sed -ri -e "s/allow-hotplug ${ETHNAME}/auto eth0/g" -e "s/(iface) ${ETHNAME} (inet) dhcp/\1 eth0 \2 static/g" /etc/network/interfaces
    cat >> /etc/network/interfaces <<-EOF
address ${IP}/${PREFIX}
gateway ${GATEWAY}
dns-nameservers ${PRIMARY_DNS} ${BACKUP_DNS}
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_ip(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        set_rocky_almalinux_centos_ip
    elif [ ${OS_ID} == "Ubuntu" ];then
        set_ubuntu_ip
    else
        set_debian_ip
    fi
}

set_dual_rocky_almalinux_centos_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    ETHNAME2=`ip addr | awk -F"[ :]" '/^3/{print $3}'`
    CONNECTION_NAME1=`nmcli dev | awk 'NR==2{print $4,$5,$6}'`
    CONNECTION_NAME2=`nmcli dev | awk 'NR==3{print $4,$5,$6}'`
    while true; do
        read -p "请输入第一块网卡IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX2
    if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
        nmcli connection modify "${CONNECTION_NAME}" con-name ${ETHNAME}
        cat > /etc/sysconfig/network-scripts/ifcfg-${ETHNAME} <<-EOF
NAME=${ETHNAME}
DEVICE=${ETHNAME}
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=${IP}
PREFIX=${PREFIX}
GATEWAY=${GATEWAY}
DNS1=${PRIMARY_DNS}
DNS2=${BACKUP_DNS}
EOF
        nmcli connection modify "${CONNECTION_NAME2}" con-name ${ETHNAME2}
        cat > /etc/sysconfig/network-scripts/ifcfg-${ETHNAME2} <<-EOF
NAME=${ETHNAME2}
DEVICE=${ETHNAME2}
ONBOOT=yes
BOOTPROTO=none
TYPE=Ethernet
IPADDR=${IP2}
PREFIX=${PREFIX2}
EOF
        ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,10秒后,机器会自动重启!"${END}
	    sleep 10 && shutdown -r now
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请使用新IP重新登录!"${END}
        cat > /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection <<-EOF
[connection]
id=${ETHNAME}
type=ethernet
interface-name=${ETHNAME}

[ethernet]

[ipv4]
address1=${IP}/${PREFIX},${GATEWAY}
dns=${PRIMARY_DNS};${BACKUP_DNS};
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
EOF
        nmcli connection modify "${CONNECTION_NAME2}" con-name ${ETHNAME2}
        cat > /etc/NetworkManager/system-connections/${ETHNAME2}.nmconnection <<-EOF
[connection]
id=${ETHNAME2}
type=ethernet
interface-name=${ETHNAME2}

[ethernet]

[ipv4]
address1=${IP2}/${PREFIX2}
method=manual

[ipv6]
addr-gen-mode=default
method=auto

[proxy]
EOF
        chmod 600 /etc/NetworkManager/system-connections/${ETHNAME2}.nmconnection
    fi
    nmcli con reload && nmcli dev up ${ETHNAME} ${ETHNAME2} >& /dev/null
}

set_dual_ubuntu_ip(){
    while true; do
        read -p "请输入第一块网卡IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX2
    if [ ${OS_RELEASE_VERSION} == "18" ];then
        cat > /etc/netplan/01-netcfg.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    elif [ ${OS_RELEASE_VERSION} == "20" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    elif [ ${OS_RELEASE_VERSION} == "22" ];then
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    else
        cat > /etc/netplan/50-cloud-init.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${PREFIX}] 
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [${PRIMARY_DNS}, ${BACKUP_DNS}]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${PREFIX2}] 
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_dual_debian_ip(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    while true; do
        read -p "请输入第一块网卡IP地址: " IP
        check_ip ${IP}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入主DNS地址(例如:阿里:223.5.5.5,腾讯:119.29.29.29,公共:114.114.114.114,google:8.8.8.8等): " PRIMARY_DNS
        check_ip ${PRIMARY_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入备用DNS地址(例如:阿里:223.6.6.6,腾讯:119.28.28.28,公共:114.114.115.115,google:8.8.4.4等): " BACKUP_DNS
        check_ip ${BACKUP_DNS}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " PREFIX2
    sed -ri -e "s/allow-hotplug ${ETHNAME}/auto eth0/g" -e "s/(iface) ${ETHNAME} (inet) dhcp/\1 eth0 \2 static/g" /etc/network/interfaces
    cat >> /etc/network/interfaces <<-EOF
address ${IP}/${PREFIX}
gateway ${GATEWAY}
dns-nameservers ${PRIMARY_DNS} ${BACKUP_DNS}

auto eth1
iface eth1 inet static
address ${IP2}/${PREFIX2}
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_dual_ip(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        set_dual_rocky_almalinux_centos_ip
    elif [ ${OS_ID} == "Ubuntu" ];then
        set_dual_ubuntu_ip
    else
        set_dual_debian_ip
    fi
}

set_hostname(){
    read -p "请输入主机名: " HOST
    hostnamectl set-hostname ${HOST}
    ${COLOR}"${OS_ID} ${OS_RELEASE} 主机名设置成功,请重新登录生效!"${END}
}

aliyun(){
    MIRROR=mirrors.aliyun.com
}

huawei(){
    MIRROR=repo.huaweicloud.com
}

tencent(){
    MIRROR=mirrors.tencent.com
}

tuna(){
    MIRROR=mirrors.tuna.tsinghua.edu.cn
}

netease(){
    MIRROR=mirrors.163.com
}

sohu(){
    MIRROR=mirrors.sohu.com
}

nju(){
    MIRROR=mirrors.nju.edu.cn
}

ustc(){
    MIRROR=mirrors.ustc.edu.cn
}

sjtu(){
    MIRROR=mirrors.sjtug.sjtu.edu.cn
}

xjtu(){
    MIRROR=mirrors.xjtu.edu.cn
}

bfsu(){
    MIRROR=mirrors.bfsu.edu.cn
}

bjtu(){
    MIRROR=mirror.bjtu.edu.cn
}

pku(){
    MIRROR=mirrors.pku.edu.cn
}

archive_fedora(){
    MIRROR=archives.fedoraproject.org
}

set_yum_rocky9(){
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_URL} == "aliyun" -o ${MIRROR_URL} == "xjtu" ];then
        cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/rockylinux/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/rockylinux/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever

[extras]
name=extras
baseurl=https://${MIRROR}/rockylinux/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever
EOF
    elif [ ${MIRROR_URL} == "sohu" ];then
        cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/Rocky/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/Rocky/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever

[extras]
name=extras
baseurl=https://${MIRROR}/Rocky/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever
EOF
    else
        cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/rocky/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/rocky/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever

[extras]
name=extras
baseurl=https://${MIRROR}/rocky/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

rocky9_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)网易镜像源
4)搜狐镜像源
5)南京大学镜像源
6)中科大镜像源
7)上海交通大学镜像源
8)西安交通大学镜像源
9)北京大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_rocky9
            ;;
        2)
            tencent
            set_yum_rocky9
            ;;
        3)
            netease
            set_yum_rocky9
            ;;
        4)
            sohu
            set_yum_rocky9
            ;;
        5)
            nju
            set_yum_rocky9
            ;;
        6)
            ustc
            set_yum_rocky9
            ;;
        7)
            sjtu
            set_yum_rocky9
            ;;
        8)
            xjtu
            set_yum_rocky9
            ;;
        9)
            pku
            set_yum_rocky9
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_devel_rocky9(){
    MIRROR_MIRROR=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_MIRROR} == "aliyun" -o ${MIRROR_MIRROR} == "xjtu" ];then
        cat > /etc/yum.repos.d/devel.repo <<-EOF
[devel]
name=devel
baseurl=https://${MIRROR}/rockylinux/\$releasever/devel/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever
EOF
    elif [ ${MIRROR_MIRROR} == "sohu" ];then
        cat > /etc/yum.repos.d/devel.repo <<-EOF
[devel]
name=devel
baseurl=https://${MIRROR}/Rocky/\$releasever/devel/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever
EOF
    else
        cat > /etc/yum.repos.d/devel.repo <<-EOF
[devel]
name=devel
baseurl=https://${MIRROR}/rocky/\$releasever/devel/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-\$releasever
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} devel源设置完成!"${END}
}

rocky9_devel_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)网易镜像源
4)搜狐镜像源
5)南京大学镜像源
6)中科大镜像源
7)上海交通大学镜像源
8)西安交通大学镜像源
9)北京大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " NUM
        case ${NUM} in
        1)
            aliyun
            set_devel_rocky9
            ;;
        2)
            tencent
            set_devel_rocky9
            ;;
        3)
            netease
            set_devel_rocky9
            ;;
        4)
            sohu
            set_devel_rocky9
            ;;
        5)
            nju
            set_devel_rocky9
            ;;
        6)
            ustc
            set_devel_rocky9
            ;;
        7)
            sjtu
            set_devel_rocky9
            ;;
        8)
            xjtu
            set_devel_rocky9
            ;;
        9)
            pku
            set_devel_rocky9
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_yum_almalinux9(){
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/almalinux/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/almalinux/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9

[extras]
name=extras
baseurl=https://${MIRROR}/almalinux/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

almalinux9_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)南京大学镜像源
4)上海交通大学镜像源
5)北京大学镜像源
6)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-6): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_almalinux9
            ;;
        2)
            tencent
            set_yum_almalinux9
            ;;
        3)
            nju
            set_yum_almalinux9
            ;;
        4)
            sjtu
            set_yum_almalinux9
            ;;
        5)
            pku
            set_yum_almalinux9
            ;;
        6)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-6)!"${END}
            ;;
        esac
    done
}

set_crb_almalinux9(){
    cat > /etc/yum.repos.d/crb.repo <<-EOF
[crb]
name=crb
baseurl=https://${MIRROR}/almalinux/\$releasever/CRB/\$basearch/os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux-9
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} crb源设置完成!"${END}
}

almalinux9_crb_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)南京大学镜像源
4)上海交通大学镜像源
5)北京大学镜像源
6)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-6): " NUM
        case ${NUM} in
        1)
            aliyun
            set_crb_almalinux9
            ;;
        2)
            tencent
            set_crb_almalinux9
            ;;
        3)
            nju
            set_crb_almalinux9
            ;;
        4)
            sjtu
            set_crb_almalinux9
            ;;
        5)
            pku
            set_crb_almalinux9
            ;;
        6)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-6)!"${END}
            ;;
        esac
    done
}

set_yum_rocky8(){
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_URL} == "aliyun" -o ${MIRROR_URL} == "xjtu" ];then
        cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/rockylinux/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/rockylinux/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[extras]
name=extras
baseurl=https://${MIRROR}/rockylinux/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
    elif [ ${MIRROR_URL} == "sohu" ];then
        cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/Rocky/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/Rocky/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[extras]
name=extras
baseurl=https://${MIRROR}/Rocky/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
    else
        cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/rocky/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/rocky/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial

[extras]
name=extras
baseurl=https://${MIRROR}/rocky/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

rocky8_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)网易镜像源
4)搜狐镜像源
5)南京大学镜像源
6)中科大镜像源
7)上海交通大学镜像源
8)西安交通大学镜像源
9)北京大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_rocky8
            ;;
        2)
            tencent
            set_yum_rocky8
            ;;
        3)
            netease
            set_yum_rocky8
            ;;
        4)
            sohu
            set_yum_rocky8
            ;;
        5)
            nju
            set_yum_rocky8
            ;;
        6)
            ustc
            set_yum_rocky8
            ;;
        7)
            sjtu
            set_yum_rocky8
            ;;
        8)
            xjtu
            set_yum_rocky8
            ;;
        9)
            pku
            set_yum_rocky8
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_powertools_rocky8(){
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_URL} == "aliyun" -o ${MIRROR_URL} == "xjtu" ];then
        cat > /etc/yum.repos.d/powertools.repo <<-EOF
[PowerTools]
name=PowerTools
baseurl=https://${MIRROR}/rockylinux/\$releasever/PowerTools/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
    elif [ ${MIRROR_URL} == "sohu" ];then
        cat > /etc/yum.repos.d/powertools.repo <<-EOF
[PowerTools]
name=PowerTools
baseurl=https://${MIRROR}/Rocky/\$releasever/PowerTools/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
    else
        cat > /etc/yum.repos.d/powertools.repo <<-EOF
[PowerTools]
name=PowerTools
baseurl=https://${MIRROR}/rocky/\$releasever/PowerTools/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-rockyofficial
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} PowerTools源设置完成!"${END}
}

rocky8_powertools_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)网易镜像源
4)搜狐镜像源
5)南京大学镜像源
6)中科大镜像源
7)上海交通大学镜像源
8)西安交通大学镜像源
9)北京大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " NUM
        case ${NUM} in
        1)
            aliyun
            set_powertools_rocky8
            ;;
        2)
            tencent
            set_powertools_rocky8
            ;;
        3)
            netease
            set_powertools_rocky8
            ;;
        4)
            sohu
            set_powertools_rocky8
            ;;
        5)
            nju
            set_powertools_rocky8
            ;;
        6)
            ustc
            set_powertools_rocky8
            ;;
        7)
            sjtu
            set_powertools_rocky8
            ;;
        8)
            xjtu
            set_powertools_rocky8
            ;;
        9)
            pku
            set_powertools_rocky8
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_yum_almalinux8(){
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/almalinux/\$releasever/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/almalinux/\$releasever/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux

[extras]
name=extras
baseurl=https://${MIRROR}/almalinux/\$releasever/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

almalinux8_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)南京大学镜像源
4)上海交通大学镜像源
5)北京大学镜像源
6)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-6): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_almalinux8
            ;;
        2)
            tencent
            set_yum_almalinux8
            ;;
        3)
            nju
            set_yum_almalinux8
            ;;
        4)
            sjtu
            set_yum_almalinux8
            ;;
        5)
            pku
            set_yum_almalinux8
            ;;
        6)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-6)!"${END}
            ;;
        esac
    done
}

set_powertools_almalinux8(){
    cat > /etc/yum.repos.d/powertools.repo <<-EOF
[powertools]
name=powertools
baseurl=https://${MIRROR}/almalinux/\$releasever/PowerTools/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-AlmaLinux
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} PowerTools源设置完成!"${END}
}

almalinux8_powertools_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)南京大学镜像源
4)上海交通大学镜像源
5)北京大学镜像源
6)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-6): " NUM
        case ${NUM} in
        1)
            aliyun
            set_powertools_almalinux8
            ;;
        2)
            tencent
            set_powertools_almalinux8
            ;;
        3)
            nju
            set_powertools_almalinux8
            ;;
        4)
            sjtu
            set_powertools_almalinux8
            ;;
        5)
            pku
            set_powertools_almalinux8
            ;;
        6)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-6)!"${END}
            ;;
        esac
    done
}

set_yum_centos_stream9(){
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/centos-stream/\$stream/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/centos-stream/\$stream/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[extras-common]
name=extras-common
baseurl=https://${MIRROR}/centos-stream/SIGs/\$stream/extras/\$basearch/extras-common/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

centos_stream9_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_centos_stream9
            ;;
        2)
            huawei
            set_yum_centos_stream9
            ;;
        3)
            tencent
            set_yum_centos_stream9
            ;;
        4)
            tuna
            set_yum_centos_stream9
            ;;
        5)
            nju
            set_yum_centos_stream9
            ;;
        6)
            ustc
            set_yum_centos_stream9
            ;;
        7)
            bfsu
            set_yum_centos_stream9
            ;;
        8)
            pku
            set_yum_centos_stream9
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_crb_centos_stream9(){
    cat > /etc/yum.repos.d/crb.repo <<-EOF
[crb]
name=crb
baseurl=https://${MIRROR}/centos-stream/\$releasever-stream/CRB/\$basearch/os
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} crb源设置完成!"${END}
}

centos_stream9_crb_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_crb_centos_stream9
            ;;
        2)
            huawei
            set_crb_centos_stream9
            ;;
        3)
            tencent
            set_crb_centos_stream9
            ;;
        4)
            tuna
            set_crb_centos_stream9
            ;;
        5)
            nju
            set_crb_centos_stream9
            ;;
        6)
            ustc
            set_crb_centos_stream9
            ;;
        6)
            bfsu
            set_crb_centos_stream9
            ;;			
        8)
            pku
            set_crb_centos_stream9
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_yum_centos_stream8(){
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    cat > /etc/yum.repos.d/base.repo <<-EOF
[BaseOS]
name=BaseOS
baseurl=https://${MIRROR}/centos-vault/\$stream/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[AppStream]
name=AppStream
baseurl=https://${MIRROR}/centos-vault/\$stream/AppStream/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

[extras]
name=extras
baseurl=https://${MIRROR}/centos-vault/\$stream/extras/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

centos_stream8_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_centos_stream8
            ;;
        2)
            huawei
            set_yum_centos_stream8
            ;;
        3)
            tencent
            set_yum_centos_stream8
            ;;
        4)
            tuna
            set_yum_centos_stream8
            ;;
        5)
            nju
            set_yum_centos_stream8
            ;;
        6)
            ustc
            set_yum_centos_stream8
            ;;
        6)
            bfsu
            set_yum_centos_stream8
            ;;			
        8)
            pku
            set_yum_centos_stream8
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_powertools_centos_stream8(){
    cat > /etc/yum.repos.d/powertools.repo <<-EOF
[PowerTools]
name=PowerTools
baseurl=https://${MIRROR}/centos-vault/\$stream/PowerTools/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} PowerTools源设置完成!"${END}
}

centos_stream8_powertools_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_powertools_centos_stream8
            ;;
        2)
            huawei
            set_powertools_centos_stream8
            ;;
        3)
            tencent
            set_powertools_centos_stream8
            ;;
        4)
            tuna
            set_powertools_centos_stream8
            ;;
        5)
            nju
            set_powertools_centos_stream8
            ;;
        6)
            ustc
            set_powertools_centos_stream8
            ;;
        7)
            bfsu
            set_powertools_centos_stream8
            ;;
        8)
            pku
            set_powertools_centos_stream8
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_epel_rocky_almalinux_centos8_9(){
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_URL} == "sohu" ];then
        cat > /etc/yum.repos.d/epel.repo <<-EOF
[epel]
name=epel
baseurl=https://${MIRROR}/fedora-epel/\$releasever/Everything/\$basearch/
gpgcheck=1
gpgkey=https://${MIRROR}/fedora-epel/RPM-GPG-KEY-EPEL-\$releasever
EOF
    elif [ ${MIRROR_URL} == "sjtu" ];then
        cat > /etc/yum.repos.d/epel.repo <<-EOF
[epel]
name=epel
baseurl=https://${MIRROR}/fedora/epel/\$releasever/Everything/\$basearch/
gpgcheck=1
gpgkey=https://${MIRROR}/fedora/epel/RPM-GPG-KEY-EPEL-\$releasever
EOF
    else
        cat > /etc/yum.repos.d/epel.repo <<-EOF
[epel]
name=epel
baseurl=https://${MIRROR}/epel/\$releasever/Everything/\$basearch/
gpgcheck=1
gpgkey=https://${MIRROR}/epel/RPM-GPG-KEY-EPEL-\$releasever
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null
    dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} EPEL源设置完成!"${END}
}

rocky_almalinux_centos8_9_epel_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)搜狐镜像源
6)南京大学镜像源
7)中科大镜像源
8)上海交通大学镜像源
9)西安交通大学镜像源
9)北京外国语大学镜像源
11)北京大学镜像源
12)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-12): " NUM
        case ${NUM} in
        1)
            aliyun
            set_epel_rocky_almalinux_centos8_9
            ;;
        2)
            huawei
            set_epel_rocky_almalinux_centos8_9
            ;;
        3)
            tencent
            set_epel_rocky_almalinux_centos8_9
            ;;
        4)
            tuna
            set_epel_rocky_almalinux_centos8_9
            ;;
        5)
            sohu
            set_epel_rocky_almalinux_centos8_9
            ;;
        6)
            nju
            set_epel_rocky_almalinux_centos8_9
            ;;
        7)
            ustc
            set_epel_rocky_almalinux_centos8_9
            ;;
        8)
            sjtu
            set_epel_rocky_almalinux_centos8_9
            ;;
        9)
            xjtu
            set_epel_rocky_almalinux_centos8_9
            ;;
        10)
            bfsu
            set_epel_rocky_almalinux_centos8_9
            ;;
        11)
            pku
            set_epel_rocky_almalinux_centos8_9
            ;;

        12)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-12)!"${END}
            ;;
        esac
    done
}

set_yum_centos7(){    
    [ -d /etc/yum.repos.d/backup ] || { mkdir /etc/yum.repos.d/backup; mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup; }
    OS_RELEASE_FULL_VERSION=`cat /etc/centos-release | sed -rn 's/^(CentOS Linux release )(.*)( \(Core\))/\2/p'`
    cat > /etc/yum.repos.d/base.repo <<-EOF
[base]
name=base
baseurl=https://${MIRROR}/centos-vault/${OS_RELEASE_FULL_VERSION}/os/\$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-\$releasever

[extras]
name=extras
baseurl=https://${MIRROR}/centos-vault/${OS_RELEASE_FULL_VERSION}/extras/\$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-\$releasever

[updates]
name=updates
baseurl=https://${MIRROR}/centos-vault/${OS_RELEASE_FULL_VERSION}/updates/\$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-\$releasever
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    yum clean all &> /dev/null
    yum makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} YUM源设置完成!"${END}
}

centos7_base_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)南京大学镜像源
6)中科大镜像源
7)北京外国语大学镜像源
8)北京大学镜像源
9)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_centos7
            ;;
        2)
            huawei
            set_yum_centos7
            ;;
        3)
            tencent
            set_yum_centos7
            ;;
        4)
            tuna
            set_yum_centos7
            ;;
        5)
            nju
            set_yum_centos7
            ;;
        6)
            ustc
            set_yum_centos7
            ;;
        7)
            bfsu
            set_yum_centos7
            ;;
        8)
            pku
            set_yum_centos7
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${END}
            ;;
        esac
    done
}

set_epel_centos7(){
    MIRROR_URL=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_URL} == "aliyun" -o ${MIRROR_URL} == "tencent" ];then
        cat > /etc/yum.repos.d/epel.repo <<-EOF
[epel]
name=epel
baseurl=https://${MIRROR}/epel-archive/\$releasever/\$basearch/
gpgcheck=1
gpgkey=https://${MIRROR}/epel-archive/RPM-GPG-KEY-EPEL-\$releasever
EOF
    else
        cat > /etc/yum.repos.d/epel.repo <<-EOF
[epel]
name=epel
baseurl=https://${MIRROR}/pub/archive/epel/\$releasever/\$basearch/
gpgcheck=1
gpgkey=https://${MIRROR}/pub/archive/epel/RPM-GPG-KEY-EPEL-\$releasever
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    yum clean all &> /dev/null
    yum makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} EPEL源设置完成!"${END}
}

centos7_epel_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)腾讯镜像源
3)fedora镜像源
4)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-4): " NUM
        case ${NUM} in
        1)
            aliyun
            set_epel_centos7
            ;;
        2)
            tencent
            set_epel_centos7
            ;;
        3)
            archive_fedora
            set_epel_centos7
            ;;
        4)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-4)!"${END}
            ;;
        esac
    done
}

rocky_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)base仓库
2)epel仓库
3)Rocky 9 devel仓库
4)Rocky 8 PowerTools仓库
5)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-5): " NUM
        case ${NUM} in
        1)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                rocky8_base_menu
            else
                rocky9_base_menu
            fi
            ;;
        2)
            rocky_almalinux_centos8_9_epel_menu
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                rocky9_devel_menu
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有devel源,不用设置!"${END}
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                rocky8_powertools_menu
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有powertools源,不用设置!"${END}
            fi
            ;;
        5)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-5)!"${END}
            ;;
        esac
    done
}

almalinux_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)base仓库
2)epel仓库
3)AlmaLinux 9 crb仓库
4)AlmaLinux 8 PowerTools仓库
5)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-5): " NUM
        case ${NUM} in
        1)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                almalinux8_base_menu
            else
                almalinux9_base_menu
            fi
            ;;
        2)
            rocky_almalinux_centos8_9_epel_menu
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                almalinux9_crb_menu
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有crb源,不用设置!"${END}
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                almalinux8_powertools_menu
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有powertools源,不用设置!"${END}
            fi
            ;;
        5)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-5)!"${END}
            ;;
        esac
    done
}

centos_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)base仓库
2)epel仓库
3)CentOS Stream 9 crb仓库
4)CentOS Stream 8 PowerTools仓库
5)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-5): " NUM
        case ${NUM} in
        1)
            if [ ${OS_NAME} == "Stream" ];then
                if [ ${OS_RELEASE_VERSION} == "8" ];then
                    centos_stream8_base_menu
                else
                    centos_stream9_base_menu
                fi
            else
                centos7_base_menu
            fi
            ;;
        2)
            if [ ${OS_RELEASE_VERSION} == "7" ];then
                centos7_epel_menu
            else
                rocky_almalinux_centos8_9_epel_menu
            fi
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                centos_stream9_crb_menu
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有crb源,不用设置!"${END}
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                centos_stream8_powertools_menu
            else
                ${COLOR}"${OS_ID} ${OS_RELEASE} 没有powertools源,不用设置!"${END}
            fi
            ;;
        5)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-5)!"${END}
            ;;
        esac
    done
}

set_ubuntu_apt(){
    if [ ${OS_RELEASE_VERSION} == "18" -o ${OS_RELEASE_VERSION} == "20" -o ${OS_RELEASE_VERSION} == "22" ];then
        mv /etc/apt/sources.list /etc/apt/sources.list.bak
        cat > /etc/apt/sources.list <<-EOF
deb http://${MIRROR}/ubuntu/ $(lsb_release -cs) main restricted universe multiverse
deb-src http://${MIRROR}/ubuntu/ $(lsb_release -cs) main restricted universe multiverse

deb http://${MIRROR}/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse
deb-src http://${MIRROR}/ubuntu/ $(lsb_release -cs)-security main restricted universe multiverse

deb http://${MIRROR}/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse
deb-src http://${MIRROR}/ubuntu/ $(lsb_release -cs)-updates main restricted universe multiverse

deb http://${MIRROR}/ubuntu/ $(lsb_release -cs)-proposed main restricted universe multiverse
deb-src http://${MIRROR}/ubuntu/ $(lsb_release -cs)-proposed main restricted universe multiverse

deb http://${MIRROR}/ubuntu/ $(lsb_release -cs)-backports main restricted universe multiverse
deb-src http://${MIRROR}/ubuntu/ $(lsb_release -cs)-backports main restricted universe multiverse
EOF
    else
        mv /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
        cat > /etc/apt/sources.list.d/ubuntu.sources <<-EOF
Types: deb
URIs: https://${MIRROR}/ubuntu
Suites: $(lsb_release -cs) $(lsb_release -cs)-updates $(lsb_release -cs)-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: https://${MIRROR}/ubuntu
Suites: $(lsb_release -cs)-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    apt update &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} APT源设置完成!"${END}
}

apt_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)网易镜像源
6)搜狐镜像源
7)南京大学镜像源
8)中科大镜像源
9)上海交通大学镜像源
10)西安交通大学镜像源
11)北京外国语大学镜像源
12)北京交通大学镜像源
13)北京大学镜像源
14)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-14): " NUM
        case ${NUM} in
        1)
            aliyun
            set_ubuntu_apt
            ;;
        2)
            huawei
            set_ubuntu_apt
            ;;
        3)
            tencent
            set_ubuntu_apt
            ;;
        4)
            tuna
            set_ubuntu_apt
            ;;
        5)
            netease
            set_ubuntu_apt
            ;;
        6)
            sohu
            set_ubuntu_apt
            ;;
        7)
            nju
            set_ubuntu_apt
            ;;
        8)
            ustc
            set_ubuntu_apt
            ;;
        9)
            sjtu
            set_ubuntu_apt
            ;;
        10)
            xjtu
            set_ubuntu_apt
            ;;
        11)
            bfsu
            set_ubuntu_apt
            ;;
        12)
            bjtu
            set_ubuntu_apt
            ;;
        13)
            pku
            set_ubuntu_apt
            ;;

        14)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-14)!"${END}
            ;;
        esac
    done
}

set_debian_apt(){
    mv /etc/apt/sources.list /etc/apt/sources.list.bak
    cat > /etc/apt/sources.list <<-EOF
deb https://${MIRROR}/debian/ $(lsb_release -cs) main contrib non-free non-free-firmware
# deb-src https://${MIRROR}/debian/ $(lsb_release -cs) main contrib non-free non-free-firmware

deb https://${MIRROR}/debian/ $(lsb_release -cs)-updates main contrib non-free non-free-firmware
# deb-src https://${MIRROR}/debian/ $(lsb_release -cs)-updates main contrib non-free non-free-firmware

deb https://${MIRROR}/debian/ $(lsb_release -cs)-backports main contrib non-free non-free-firmware
# deb-src https://${MIRROR}/debian/ $(lsb_release -cs)-backports main contrib non-free non-free-firmware

deb https://${MIRROR}/debian-security $(lsb_release -cs)-security main contrib non-free non-free-firmware
# deb-src https://${MIRROR}/debian-security $(lsb_release -cs)-security main contrib non-free non-free-firmware
EOF
    ${COLOR}"更新镜像源中,请稍等..."${END}
    apt update &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} APT源设置完成!"${END}
}

debian_menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)阿里镜像源
2)华为镜像源
3)腾讯镜像源
4)清华镜像源
5)网易镜像源
6)搜狐镜像源
7)南京大学镜像源
8)中科大镜像源
9)上海交通大学镜像源
10)西安交通大学镜像源
11)北京外国语大学镜像源
12)北京交通大学镜像源
13)北京大学镜像源
14)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-14): " NUM
        case ${NUM} in
        1)
            aliyun
            set_debian_apt
            ;;
        2)
            huawei
            set_debian_apt
            ;;
        3)
            tencent
            set_debian_apt
            ;;
        4)
            tuna
            set_debian_apt
            ;;
        5)
            netease
            set_debian_apt
            ;;
        6)
            sohu
            set_debian_apt
            ;;
        7)
            nju
            set_debian_apt
            ;;
        8)
            ustc
            set_debian_apt
            ;;
        9)
            sjtu
            set_debian_apt
            ;;
        10)
            xjtu
            set_debian_apt
            ;;
        11)
            bfsu
            set_debian_apt
            ;;
        12)
            bjtu
            set_debian_apt
            ;;
        13)
            pku
            set_debian_apt
            ;;
        14)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-14)!"${END}
            ;;
        esac
    done
}

set_mirror_repository(){
    if [ ${OS_ID} == "Rocky" ];then
        rocky_menu
    elif [ ${OS_ID} == "AlmaLinux" ];then
        almalinux_menu
    elif [ ${OS_ID} == "CentOS" ];then
        centos_menu
    elif [ ${OS_ID} == "Ubuntu" ];then
        apt_menu
    else
        debian_menu
    fi
}

rocky_almalinux_centos_minimal_install(){
    ${COLOR}'开始安装“Minimal安装建议安装软件包”,请稍等......'${END}
    yum -y install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} Minimal安装建议安装软件包已安装完成!"${END}
}

ubuntu_debian_minimal_install(){
    ${COLOR}'开始安装“Minimal安装建议安装软件包”,请稍等......'${END}
    apt -y install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev gcc openssh-server iotop unzip zip
    ${COLOR}"${OS_ID} ${OS_RELEASE} Minimal安装建议安装软件包已安装完成!"${END}
}

minimal_install(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        rocky_almalinux_centos_minimal_install
    else
        ubuntu_debian_minimal_install
    fi
}

disable_firewall(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        rpm -q firewalld &> /dev/null && { systemctl disable --now firewalld &> /dev/null; ${COLOR}"${OS_ID} ${OS_RELEASE} Firewall防火墙已关闭!"${END}; } || ${COLOR}"${OS_ID} ${OS_RELEASE} iptables防火墙已关闭!"${END}
    elif [ ${OS_ID} == "Ubuntu" ];then
        dpkg -s ufw &> /dev/null && { systemctl disable --now ufw &> /dev/null; ${COLOR}"${OS_ID} ${OS_RELEASE} ufw防火墙已关闭!"${END}; } || ${COLOR}"${OS_ID} ${OS_RELEASE}  没有ufw防火墙服务,不用关闭!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE}  没有安装防火墙服务,不用关闭!"${END}
    fi
}

disable_selinux(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        if [ `getenforce` == "Enforcing" ];then
            sed -ri.bak 's/^(SELINUX=).*/\1disabled/' /etc/selinux/config
            ${COLOR}"${OS_ID} ${OS_RELEASE} SELinux已禁用,请重新启动系统后才能生效!"${END}
        else
            ${COLOR}"${OS_ID} ${OS_RELEASE} SELinux已被禁用,不用设置!"${END}
        fi
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} SELinux默认没有安装,不用设置!"${END}
    fi
}

set_swap(){
    sed -ri 's/.*swap.*/#&/' /etc/fstab
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 20 -o ${OS_RELEASE_VERSION} == 22 -o ${OS_RELEASE_VERSION} == 24 ];then
            SD_NAME=`lsblk|awk -F"[ └─]" '/SWAP/{printf $3}'`
            systemctl mask dev-${SD_NAME}.swap &> /dev/null
        fi
    fi
    swapoff -a
    ${COLOR}"${OS_ID} ${OS_RELEASE} 禁用swap成功!"${END}
}

set_localtime(){
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    echo 'Asia/Shanghai' >/etc/timezone
    if [ ${OS_ID} == "Ubuntu" ];then
        cat >> /etc/default/locale <<-EOF
LC_TIME=en_DK.UTF-8
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统时区已设置成功,请重启系统后生效!"${END}
}

set_limits(){
    cat >> /etc/security/limits.conf <<-EOF
root     soft   core     unlimited
root     hard   core     unlimited
root     soft   nproc    1000000
root     hard   nproc    1000000
root     soft   nofile   1000000
root     hard   nofile   1000000
root     soft   memlock  32000
root     hard   memlock  32000
root     soft   msgqueue 8192000
root     hard   msgqueue 8192000
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 优化资源限制参数成功!"${END}
}

set_kernel(){
    modprobe  br_netfilter
    cat > /etc/sysctl.conf <<-EOF
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 1

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296

# TCP kernel paramater
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_sack = 1

# socket buffer
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 20480
net.core.optmem_max = 81920

# TCP conn
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_syn_retries = 3
net.ipv4.tcp_retries1 = 3
net.ipv4.tcp_retries2 = 15

# tcp conn reuse
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_max_tw_buckets = 20000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syncookies = 1

# keepalive conn
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.ip_local_port_range = 10001    65000

# swap
vm.overcommit_memory = 0
vm.swappiness = 10

#net.ipv4.conf.eth1.rp_filter = 0
#net.ipv4.conf.lo.arp_ignore = 1
#net.ipv4.conf.lo.arp_announce = 2
#net.ipv4.conf.all.arp_ignore = 1
#net.ipv4.conf.all.arp_announce = 2
EOF
    MAIN_KERNEL=`uname -r | cut -d. -f1`
    SUB_KERNEL=`uname -r | cut -d. -f2`
    if [ ${MAIN_KERNEL} -lt "4" -a ${SUB_KERNEL} -lt "12" ];then
    cat >> /etc/sysctl.conf <<-EOF	
net.ipv4.tcp_tw_recycle = 0
EOF
    fi
    sysctl -p &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} 优化内核参数成功!"${END}
}

optimization_sshd(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        sed -ri.bak -e 's/^#(UseDNS).*/\1 no/' -e 's/^(GSSAPIAuthentication).*/\1 no/' /etc/ssh/sshd_config
    else
        sed -ri.bak -e 's/^#(UseDNS).*/\1 no/' -e 's/^#(GSSAPIAuthentication).*/\1 no/' /etc/ssh/sshd_config
    fi
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 24 ];then
            systemctl restart ssh
        fi
    else
        systemctl restart sshd
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} SSH已优化完成!"${END}
}

set_sshd_port(){
    disable_selinux
    disable_firewall
    read -p "请输入端口号: " PORT
    sed -i 's/#Port 22/Port '${PORT}'/' /etc/ssh/sshd_config
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 24 ];then
            systemctl restart ssh
        fi
    else
        systemctl restart sshd
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 更改SSH端口号已完成,请重新登陆后生效!"${END}
}

set_rocky_almalinux_centos_alias(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    ETHNAME2=`ip addr | awk -F"[ :]" '/^3/{print $3}'`
    read -p "请输入网卡数量(仅支持1个和2个网卡,输入1或2): " IP_NUM
    if [ ${IP_NUM} == "1" ];then
        if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/sysconfig/network-scripts"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/sysconfig/network-scripts/ifcfg-${ETHNAME}"
EOF
        else
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/NetworkManager/system-connections"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection"
EOF
        fi
    else	
        if [ ${OS_RELEASE_VERSION} == "7" -o ${OS_RELEASE_VERSION} == "8" ];then
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/sysconfig/network-scripts"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/sysconfig/network-scripts/ifcfg-${ETHNAME}"
alias vie1="vim /etc/sysconfig/network-scripts/ifcfg-${ETHNAME2}"
EOF
        else
            cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/NetworkManager/system-connections"
alias cdrepo="cd /etc/yum.repos.d"
alias vie0="vim /etc/NetworkManager/system-connections/${ETHNAME}.nmconnection"
alias vie1="vim /etc/NetworkManager/system-connections/${ETHNAME2}.nmconnection"
EOF
        fi
    fi
    DISK_NAME=`lsblk|awk -F" " '/disk/{printf $1}' | cut -c1-4`
    if [ ${DISK_NAME} == "sda" ];then
        cat >>~/.bashrc <<-EOF
alias scandisk="echo '- - -' > /sys/class/scsi_host/host0/scan;echo '- - -' > /sys/class/scsi_host/host1/scan;echo '- - -' > /sys/class/scsi_host/host2/scan"
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统别名已设置成功,请重新登陆后生效!"${END}
}

set_ubuntu_alias(){
    cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/netplan"
alias cdapt="cd /etc/apt"
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统别名已设置成功,请重新登陆后生效!"${END}
}

set_debian_alias(){
    cat >>~/.bashrc <<-EOF
alias cdnet="cd /etc/network"
alias cdapt="cd /etc/apt"
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 系统别名已设置成功,请重新登陆后生效!"${END}
}

set_alias(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        if grep -Eqi "(.*cdnet|.*cdrepo|.*vie0|.*vie1|.*scandisk)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d'  -e '/.*cdrepo/d' -e '/.*vie0/d' -e '/.*vie1/d' -e '/.*scandisk/d' ~/.bashrc
            set_rocky_almalinux_centos_alias
        else
            set_rocky_almalinux_centos_alias
        fi
    elif [ ${OS_ID} == "Ubuntu" ];then
        if grep -Eqi "(.*cdnet|.*cdapt)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d' -e '/.*cdapt/d' ~/.bashrc
            set_ubuntu_alias
        else
            set_ubuntu_alias
        fi
    else
        if grep -Eqi "(.*cdnet|.*cdapt)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d' -e '/.*cdapt/d' ~/.bashrc
            set_debian_alias
        else
            set_debian_alias
        fi
    fi
}

set_vimrc(){
    read -p "请输入作者名: " AUTHOR
    read -p "请输入QQ号: " QQ
    read -p "请输入网址: " V_MIRROR
    cat >~/.vimrc <<-EOF
set ts=4
set expandtab
set ignorecase
set cursorline
set autoindent
autocmd BufNewFile *.sh exec ":call SetTitle()"
func SetTitle()
    if expand("%:e") == 'sh'
    call setline(1,"#!/bin/bash")
    call setline(2,"#")
    call setline(3,"#**********************************************************************************************")
    call setline(4,"#Author:        ${AUTHOR}")
    call setline(5,"#QQ:            ${QQ}")
    call setline(6,"#Date:          ".strftime("%Y-%m-%d"))
    call setline(7,"#FileName:      ".expand("%"))
    call setline(8,"#MIRROR:           ${V_MIRROR}")
    call setline(9,"#Description:   The test script")
    call setline(10,"#Copyright (C): ".strftime("%Y")." All rights reserved")
    call setline(11,"#*********************************************************************************************")
    call setline(12,"")
    endif
endfunc
autocmd BufNewFile * normal G
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} vimrc设置完成,请重新系统启动才能生效!"${END}
}

set_mail(){                                                                                                 
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        rpm -q postfix &> /dev/null || { yum -y install postfix &> /dev/null; systemctl enable --now postfix &> /dev/null; }
        rpm -q mailx &> /dev/null || yum -y install mailx &> /dev/null
    else
        dpkg -s mailutils &> /dev/null || apt -y install mailutils
    fi
    read -p "请输入邮箱地址: " MAIL
    read -p "请输入邮箱授权码: " AUTH
    SMTP=`echo ${MAIL} |awk -F"@" '{print $2}'`
    cat >~/.mailrc <<-EOF
set from=${MAIL}
set smtp=smtp.${SMTP}
set smtp-auth-user=${MAIL}
set smtp-auth-password=${AUTH}
set smtp-auth=login
set ssl-verify=ignore
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} 邮件设置完成,请重新登录后才能生效!"${END}
}

red(){
    P_COLOR=31
}

green(){
    P_COLOR=32
}

yellow(){
    P_COLOR=33
}

blue(){
    P_COLOR=34
}

violet(){
    P_COLOR=35
}

cyan_blue(){
    P_COLOR=36
}

random_color(){
    P_COLOR="$[RANDOM%7+31]"
}

rocky_almalinux_centos_ps1(){
    C_PS1=$(echo "PS1='\[\e[1;${P_COLOR}m\][\u@\h \W]\\$ \[\e[0m\]'" >> ~/.bashrc)
}

ubuntu_debian_ps1(){
    U_PS1=$(echo 'PS1="\[\e[1;'''${P_COLOR}'''m\]${debian_chroot:+($debian_chroot)}\u@\h:\w\\$ \[\e[0m\]"' >> ~/.bashrc)
}

set_ps1_env(){
    if [ ${OS_ID} == "Rocky" -o ${OS_ID} == "AlmaLinux" -o ${OS_ID} == "CentOS" ];then
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            rocky_almalinux_centos_ps1
        else
            rocky_almalinux_centos_ps1
        fi
    else
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            ubuntu_debian_ps1
        else
            ubuntu_debian_ps1
        fi
    fi
}

set_ps1(){
    TIPS="${COLOR}${OS_ID} ${OS_RELEASE} PS1设置成功,请重新登录生效!${END}"
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
1)31 红色
2)32 绿色
3)33 黄色
4)34 蓝色
5)35 紫色
6)36 青色
7)随机颜色
8)退出
EOF
        echo -e '\E[0m'

        read -p "请输入颜色编号(1-8): " NUM
        case ${NUM} in
        1)
            red
            set_ps1_env
            ${TIPS}
            ;;
        2)
            green
            set_ps1_env
            ${TIPS}
            ;;
        3)
            yellow
            set_ps1_env
            ${TIPS}
            ;;
        4)
            blue
            set_ps1_env
            ${TIPS}
            ;;
        5)
            violet
            set_ps1_env
            ${TIPS}
            ;;
        6)
            cyan_blue
            set_ps1_env
            ${TIPS}
            ;;
        7)
            random_color
            set_ps1_env
            ${TIPS}
            ;;
        8)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-8)!"${END}
            ;;
        esac
    done
}

set_vim(){
    echo "export EDITOR=vim" >> ~/.bashrc
}

set_vim_env(){
    if grep -Eqi ".*EDITOR" ~/.bashrc;then
        sed -i '/.*EDITOR/d' ~/.bashrc
        set_vim
    else
        set_vim
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} 默认文本编辑器设置成功,请重新登录生效!"${END}
}

set_history(){
    echo 'export HISTTIMEFORMAT="%F %T "' >> ~/.bashrc 
}

set_history_env(){
    if grep -Eqi ".*HISTTIMEFORMAT" ~/.bashrc;then
        sed -i '/.*HISTTIMEFORMAT/d' ~/.bashrc
        set_history
    else
        set_history
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} history格式设置成功,请重新登录生效!"${END}
}

disable_restart(){
    if [ -f /usr/lib/systemd/system/ctrl-alt-del.target ];then
        cp /usr/lib/systemd/system/ctrl-alt-del.target{,.bak}
        rm -f /usr/lib/systemd/system/ctrl-alt-del.target
        ${COLOR}"${OS_ID} ${OS_RELEASE} 禁用ctrl+alt+del重启处理成功!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 禁用ctrl+alt+del已处理!"${END}
    fi
}

set_ubuntu_debian_root_login(){
    if [ ${OS_ID} == "Ubuntu" -o ${OS_ID} == "Debian" ];then
        read -p "请输入密码: " PASSWORD
        echo ${PASSWORD} |sudo -S sed -ri 's@#(PermitRootLogin )prohibit-password@\1yes@' /etc/ssh/sshd_config
        if [ ${OS_ID} == "Ubuntu" ];then
            if [ ${OS_RELEASE_VERSION} == 24 ];then
                sudo systemctl restart ssh
	        fi
        else
            sudo systemctl restart sshd
        fi
        sudo -S passwd root <<-EOF
${PASSWORD}
${PASSWORD}
EOF
        ${COLOR}"${OS_ID} ${OS_RELEASE} root用户登录已设置完成,请重新登录后生效!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 系统不可用!"${END}
    fi
}

ubuntu_remove(){
    if [ ${OS_ID} == "Ubuntu" ];then
        apt -y purge ufw lxd lxd-client lxcfs liblxc-common
        ${COLOR}"${OS_ID} ${OS_RELEASE} 无用软件包卸载完成!"${END}
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 系统不可用!"${END}
    fi
}

ubuntu_20_22_24_remove_snap(){
    dpkg -s snapd &> /dev/null
    if [ $? -eq 1 ];then 
        ${COLOR}"${OS_ID} ${OS_RELEASE} snap已卸载!"${END}
    else
        systemctl disable snapd.service && systemctl disable snapd.socket && systemctl disable snapd.seeded.service
    
        sum=$(snap list | awk 'NR>=2{print $1}' | wc -l)
        while [ $sum -ne 0 ];do
            for p in $(snap list | awk 'NR>=2{print $1}'); do
                snap remove --purge $p
            done
            sum=$(snap list | awk 'NR>=2{print $1}' | wc -l)
        done
        
        apt -y autoremove --purge snapd
        
        rm -rf ~/snap && sudo rm -rf /snap && rm -rf /var/snap && rm -rf /var/lib/snapd && rm -rf /var/cache/snapd
        
        cat > /etc/apt/preferences.d/no-snapd.pref << EOF
Package: snapd
Pin: release a=*
Pin-Priority: -10
EOF
        apt update
        ${COLOR}"${OS_ID} ${OS_RELEASE} snap卸载完成!"${END}
    fi
}

ubuntu_remove_snap(){
    if [ ${OS_ID} == "Ubuntu" ];then
        if [ ${OS_RELEASE_VERSION} == 20 -o ${OS_RELEASE_VERSION} == 22 -o ${OS_RELEASE_VERSION} == 24 ];then
            ubuntu_20_22_24_remove_snap
        else
           ${COLOR}"${OS_ID} ${OS_RELEASE} 默认没有安装snap!"${END} 
        fi
    else
        ${COLOR}"${OS_ID} ${OS_RELEASE} 系统不可用!"${END}
    fi
}

menu(){
    while true;do
        echo -e "\E[$[RANDOM%7+31];1m"
        cat <<-EOF
**********************************************************************
*                           初始化脚本菜单                           *
* 1.修改网卡名                     15.设置系统别名                   *
* 2.修改IP地址和网关地址(单网卡)   16.设置vimrc配置文件              *
* 3.修改IP地址和网关地址(双网卡)   17.安装邮件服务并配置邮件         *
* 4.设置主机名                     18.设置PS1(请进入选择颜色)        *
* 5.设置镜像仓库                   19.设置默认文本编辑器为vim        *
* 6.Minimal安装建议安装软件        20.设置history格式                *
* 7.关闭防火墙                     21.禁用ctrl+alt+del重启           *
* 8.禁用SELinux                    22.Ubuntu和Debian设置root用户登录 *
* 9.禁用SWAP                       23.Ubuntu卸载无用软件包           *
* 10.设置系统时区                  24.Ubuntu卸载snap                 *
* 11.优化资源限制参数              25.重启系统                       *
* 12.优化内核参数                  26.关机                           *
* 13.优化SSH                       27.退出                           *
* 14.更改SSH端口号                                                   *
**********************************************************************
EOF
        echo -e '\E[0m'

        read -p "请选择相应的编号(1-27): " choice
        case ${choice} in
        1)
            set_eth
            ;;
        2)
            set_ip
            ;;
        3)
            set_dual_ip
            ;;
        4)
            set_hostname
            ;;
        5)
            set_mirror_repository
            ;;
        6)
            minimal_install
            ;;
        7)
            disable_firewall
            ;;
        8)
            disable_selinux
            ;;
        9)
            set_swap
            ;;
        10)
            set_localtime
            ;;
        11)
            set_limits
            ;;
        12)
            set_kernel
            ;;
        13)
            optimization_sshd
            ;;
        14)
            set_sshd_port
            ;;
        15)
            set_alias
            ;;
        16)
            set_vimrc
            ;;
        17)
            set_mail
            ;;
        18)
            set_ps1
            ;;
        19)
            set_vim_env
            ;;
        20)
            set_history_env
            ;;
        21)
            disable_restart
            ;;
        22)
            set_ubuntu_debian_root_login
            ;;
        23)
            ubuntu_remove
            ;;
        24)
            ubuntu_remove_snap
            ;;
        25)
            reboot
            ;;
        26)
            shutdown -h now
            ;;
        27)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-27)!"${END}
            ;;
        esac
    done
}

main(){
    os
    menu
}

main

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AUTOSAR OS模块详解(一) 概述

AUTOSAR OS模块详解(一) 概述 本文主要介绍AUTOSAR架构下的OS概述。 文章目录 AUTOSAR OS模块详解(一) 概述1 前言1.1 操作系统1.2 嵌入式操作系统1.3 AUTOSAR操作系统 2 AUTOSAR OS2.1 AUTOSAR OS组成2.2 AUTOSAR OS类别2.3 任务管理2.4 调度表2.5 资源管理2.6 多核特性2.7 …

5位机械工程师如何共享一台工作站的算力?

在现代化的工程领域中&#xff0c;算力已成为推动创新与技术进步的关键因素之一。对于机械工程师而言&#xff0c;强大的计算资源意味着能够更快地进行复杂设计、模拟分析以及优化工作&#xff0c;从而明显提升工作效率与项目质量。然而&#xff0c;资源总是有限的&#xff0c;…

Scala 中 set 的实战应用 :图书管理系统

1. 创建书籍集合 首先&#xff0c;我们创建一个可变的书籍集合&#xff0c;用于存储图书馆中的书籍信息。在Scala中&#xff0c;mutable.Set可以用来创建一个可变的集合。 val books mutable.Set("朝花惜拾", "活着") 2. 添加书籍 我们可以使用操作符…

DevCheck Pro手机硬件检测工具v5.33

前言 DevCheck Pro是一款手机硬件和操作系统信息检测查看工具&#xff0c;该软件的功能非常强大&#xff0c;为用户提供了系统、硬件、应用程序、相机、网络、电池等一系列信息查看功能 安装环境 [名称]&#xff1a;DevCheckPro [版本]&#xff1a;5.33 [大小]&a…

cv::intersectConvexConvex返回其中一个输入点集,两个点集不相交

问题&#xff1a;cv::intersectConvexConvex返回其中一个输入点集&#xff0c;但两个点集并不相交 版本&#xff1a;opencv 3.1.0 git上也有人反馈了intersectConvexConvex sometimes returning one of the input polygons in case of empty intersection #10044 是凸包嵌套判…

【刷题12】ctfshow刷题

来源&#xff1a;ctfshow easyPytHon_P 考点&#xff1a;代码审计&#xff0c;源代码查看 打开后查看源码&#xff0c;发现一个源码地址&#xff0c;打开看看 可以知道在此目录下有个flag.txt文件&#xff0c;再观察源码 from flask import request cmd: str request.form.get…

spark的学习-03

RDD的创建的两种方式&#xff1a; 方式一&#xff1a;并行化一个已存在的集合 方法&#xff1a;parallelize 并行的意思 将一个集合转换为RDD 方式二&#xff1a;读取外部共享存储系统 方法&#xff1a;textFile、wholeTextFile、newAPIHadoopRDD等 读取外部存储系统的数…

axios平替!用浏览器自带的fetch处理AJAX(兼容表单/JSON/文件上传)

fetch 是啥&#xff1f; fetch 函数是 JavaScript 中用于发送网络请求的内置 API&#xff0c;可以替代传统的 XMLHttpRequest。它可以发送 HTTP 请求&#xff08;如 GET、POST 等&#xff09;&#xff0c;并返回一个 Promise&#xff0c;从而简化异步操作 基本用法 /* 下面是…

Linux(CentOS)安装 Nginx

CentOS版本&#xff1a;CentOS 7 Nginx版本&#xff1a;1.24.0 有两种安装方式 一、通过 yum 安装 需要 root 权限&#xff0c;普通用户使用 sudo 进行命令操作 参考&#xff1a;https://nginx.org/en/linux_packages.html#RHEL 1、安装依赖 sudo yum install yum-utils 2…

[原创]手把手教学之前端0基础到就业——day11( Javascript )

文章目录 day11(Javascript)01Javascript①Javascript是什么②JavaScript组成③ Javascript的书写位置1. 行内式 (不推荐)2 . 内部位置使用 ( 内嵌式 )3. 外部位置使用 ( 外链式 ) 02变量1. 什么是变量2. 定义变量及赋值3. 注意事项4. 命名规范 03输入和输出1) 输出形式12) 输出…

【C++笔记】C++三大特性之继承

【C笔记】C三大特性之继承 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C三大特性之继承前言一.继承的概念及定义1.1 继承的概念1.2继承的定义1.3继承基类成员访问方式的变化1.4继承类模板 二.基类和派生类间的转…

Colorful/七彩虹iGame G-ONE Plus 12代处理器 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

【LeetCode】分发糖果 解题报告

135. 分发糖果 - 题目链接 n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。 你需要按照以下要求&#xff0c;给这些孩子分发糖果&#xff1a; 每个孩子至少分配到1个糖果。相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果&#xff0c;…

ArcGIS从Excel表格文件导入XY数据并定义坐标系与投影的方法

本文介绍在ArcMap软件中&#xff0c;从Excel表格文件中批量导入坐标点数据&#xff0c;将其保存为.shp矢量格式&#xff0c;并定义坐标系、转为投影坐标系的方法。 已知我们有一个Excel表格文件&#xff08;可以是.xls、.xlsx、.csv等多种不同的表格文件格式&#xff09;&#…

爬虫 - 二手交易电商平台数据采集 (一)

背景: 近期有一个需求需要采集某电商网站平台的商品数据进行分析。因此&#xff0c;我计划先用Python实现一个简单的版本&#xff0c;以快速测试技术的实现可能性&#xff0c;再用PHP实现一个更完整的版本。文章中涉及的技术仅为学习和测试用途&#xff0c;请勿用于商业或非法用…

「C/C++」C++标准库 之 #include<iostream> 标准输入输出

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

AI出图,在家装行业杀疯了!

家装行业作为一个庞大的产业&#xff0c;长期以来面临着诸多难题&#xff0c;而随着AIGC技术的蓬勃发展&#xff0c;AI促进家装设计行业迎来了新的春天。 在传统家装设计流程中&#xff0c;相信大家对“设计环节充满了繁琐与复杂”有着非常深刻的体验&#xff0c;设计师需要花…

MySQL核心业务大表归档过程

记录一下2年前的MySQL大表的归档&#xff0c;当时刚到公司&#xff0c;发现MySQL的业务核心库&#xff0c;超过亿条的有7张表&#xff0c;最大的表有9亿多条&#xff0c;有37张表超过5百万条&#xff0c;部分表行数如下&#xff1a; 在测试的MySQL环境 &#xff1a; pt-archiv…

深度学习——权重初始化、评估指标、梯度消失和梯度爆炸

文章目录 &#x1f33a;深度学习面试八股汇总&#x1f33a;权重初始化零初始化 (Zero Initialization)随机初始化 (Random Initialization)Xavier 初始化&#xff08;Glorot 初始化&#xff09;He 初始化正交初始化&#xff08;Orthogonal Initialization&#xff09;预训练模型…

Proteus中数码管动态扫描显示不全(已解决)

文章目录 前言解决方法后记 前言 我是直接把以前写的 51 数码管程序复制过来的&#xff0c;当时看的郭天祥的视频&#xff0c;先送段选&#xff0c;消隐后送位选&#xff0c;最后来个 1ms 的延时。 代码在 Proteus 中数码管静态是可以的&#xff0c;动态显示出了问题——显示…