s26.Rocky Linux、CentOS和Ubuntu系统初始化脚本v7版

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

Shell脚本源码地址:

Gitee:https://gitee.com/raymond9/shell

Github:https://github.com/raymond999999/shell

可以去上面的Gitee或Github仓库代码拉取脚本。
在这里插入图片描述

版本功能
v7版更新内容1.由于v6版修改的比较仓促,其中设置镜像仓库有bug,修复了其中的bug,而且设置镜像仓库可以重复修改;修复了设置ip不能成功的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_v7_1脚本内容:

[root@rocky9 ~]# cat reset_v7_1.sh
#!/bin/bash
#
#***************************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2023-12-08
#FileName:      reset_v7_1.sh
#MIRROR:        raymond.blog.csdn.net
#Description:   reset for CentOS 7 & CentOS Stream 8/9 & Ubuntu 18.04/20.04/22.04 & Rocky 8/9
#Copyright (C): 2023 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_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_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} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        set_rocky_centos_eth
    else
        set_ubuntu_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_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 "请输入子网掩码位数: " C_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -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}/${C_PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "223.5.5.5,180.76.76.76" 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}/${C_PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "223.5.5.5,180.76.76.76" 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 "请输入子网掩码位数: " U_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
EOF
    else
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${U_PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
EOF
    fi    
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_ip(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        set_rocky_centos_ip
    else
        set_ubuntu_ip
    fi
}

set_dual_rocky_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 "请输入子网掩码位数: " C_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " C_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}/${C_PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "223.5.5.5,180.76.76.76" 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}/${C_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}/${C_PREFIX}" ipv4.gateway "${GATEWAY}" ipv4.dns "223.5.5.5,180.76.76.76" 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}/${C_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 "请输入子网掩码位数: " U_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " U_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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${U_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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${U_PREFIX2}] 
EOF
    else
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${U_PREFIX}] 
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${U_PREFIX2}] 
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_dual_ip(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        set_dual_rocky_centos_ip
    else
        set_dual_ubuntu_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
}

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

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

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)退出
EOF
        echo -e '\E[0m'

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

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|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)西安交通大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " 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)
            netease
            set_yum_centos_stream8
            ;;
        6)
            nju
            set_yum_centos_stream8
            ;;
        7)
            ustc
            set_yum_centos_stream8
            ;;
        8)
            pku
            set_yum_centos_stream8
            ;;
        9)
            xjtu
            set_yum_centos_stream8
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_epel_rocky_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_RELEASE_VERSION} == "9" ];then
        sed -i -e 's|^enabled=1|enabled=0|g' /etc/yum.repos.d/epel-cisco*.repo
    fi
    ${COLOR}"更新镜像源中,请稍等..."${END}
    dnf clean all &> /dev/null && dnf makecache &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} EPEL源设置完成!"${END}
}

rocky_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)北京大学镜像源
10)西安交通大学镜像源
11)退出
EOF
        echo -e '\E[0m'

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

set_yum_centos7(){
    OLD_MIRROR=$(sed -rn '/^.*baseurl=/s@.*=(http.*)://(.*)/(.*)/\$releasever/.*/$@\2@p' /etc/yum.repos.d/CentOS-*.repo | head -1)
    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|baseurl=https://'${MIRROR}'|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)西安交通大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " 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)
            netease
            set_yum_centos7
            ;;
        6)
            nju
            set_yum_centos7
            ;;
        7)
            ustc
            set_yum_centos7
            ;;
        8)
            pku
            set_yum_centos7
            ;;
        9)
            xjtu
            set_yum_centos7
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${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} == "sohu" ];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}'/fedora-epel!g' -e 's!https\?://download\.example/pub/epel!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=!baseurl=!g' -e 's!https\?://download\.fedoraproject\.org/pub/epel!https://'${MIRROR}'/fedora/epel!g' -e 's!https\?://download\.example/pub/epel!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=!baseurl=!g' -e 's!https\?://download\.fedoraproject\.org/pub/epel!https://'${MIRROR}'/epel!g' -e 's!https\?://download\.example/pub/epel!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
    ${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)腾讯镜像源
4)清华镜像源
5)搜狐镜像源
6)南京大学镜像源
7)中科大镜像源
8)上海交通大学镜像源
9)北京大学镜像源
10)西安交通大学镜像源
11)退出
EOF
        echo -e '\E[0m'

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

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

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

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

        read -p "请输入镜像源编号(1-3): " 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} == "8" -o ${OS_RELEASE_VERSION} == "9" ];then
                rocky_centos8_9_epel_menu
            else
                centos7_epel_menu
            fi
            ;;
        3)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-3)!"${END}
            ;;
        esac
    done
}

set_apt(){
    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
    ${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)退出
EOF
        echo -e '\E[0m'

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

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

rocky_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_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} == "CentOS" -o ${OS_ID} == "Rocky" ] &> /dev/null;then
        rocky_centos_minimal_install
    else
        ubuntu_minimal_install
    fi
}

disable_firewall(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];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}
    else
        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}
    fi
}

disable_selinux(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];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 ];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(){
    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_tw_recycle = 0
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
    sysctl -p &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} 优化内核参数成功!"${END}
}

optimization_sshd(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];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
    systemctl restart sshd
    ${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
    ${COLOR}"${OS_ID} ${OS_RELEASE} 更改SSH端口号已完成,请重启系统后生效!"${END}
}

set_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_alias(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        if grep -Eqi "(.*cdnet|.*vie0|.*vie1|.*scandisk)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d'  -e '/.*vie0/d' -e '/.*vie1/d' -e '/.*scandisk/d' ~/.bashrc
            set_centos_alias
        else
            set_centos_alias
        fi
    fi
    if [ ${OS_ID} == "Ubuntu" ];then
        if grep -Eqi "(.*cdnet|.*scandisk)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d' -e '/.*scandisk/d' ~/.bashrc
            set_ubuntu_alias
        else
            set_ubuntu_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} == "CentOS" -o ${OS_ID} == "Rocky" ];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_centos_ps1(){
    C_PS1=$(echo "PS1='\[\e[1;${P_COLOR}m\][\u@\h \W]\\$ \[\e[0m\]'" >> ~/.bashrc)
}

ubuntu_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} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            rocky_centos_ps1
        else
            rocky_centos_ps1
        fi
    fi
    if [ ${OS_ID} == "Ubuntu" ];then
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            ubuntu_ps1
        else
            ubuntu_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_root_login(){
    read -p "请输入密码: " PASSWORD
    echo ${PASSWORD} |sudo -S sed -ri 's@#(PermitRootLogin )prohibit-password@\1yes@' /etc/ssh/sshd_config
    sudo systemctl restart sshd
    sudo -S passwd root <<-EOF
${PASSWORD}
${PASSWORD}
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} root用户登录已设置完成,请重新登录后生效!"${END}
}

ubuntu_remove(){
    apt purge ufw lxd lxd-client lxcfs liblxc-common
    ${COLOR}"${OS_ID} ${OS_RELEASE} 无用软件包卸载完成!"${END}
}

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

        read -p "请选择相应的编号(1-26): " 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_root_login
            ;;
        23)
            ubuntu_remove
            ;;
        24)
            reboot
            ;;
        25)
            shutdown -h now
            ;;
        26)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-26)!"${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_v7_2脚本内容:

[root@rocky9 ~]# cat reset_v7_2.sh
#!/bin/bash
#
#***************************************************************************************************
#Author:        Raymond
#QQ:            88563128
#Date:          2023-12-08
#FileName:      reset_v7_2.sh
#MIRROR:        raymond.blog.csdn.net
#Description:   reset for CentOS 7 & CentOS Stream 8/9 & Ubuntu 18.04/20.04/22.04 & Rocky 8/9
#Copyright (C): 2023 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_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_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} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        set_rocky_centos_eth
    else
        set_ubuntu_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_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 "请输入子网掩码位数: " C_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -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=${C_PREFIX}
GATEWAY=${GATEWAY}
DNS1=223.5.5.5
DNS2=180.76.76.76
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}/${C_PREFIX},${GATEWAY}
dns=223.5.5.5;180.76.76.76;
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 "请输入子网掩码位数: " U_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
EOF
    else
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${U_PREFIX}]
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
EOF
    fi    
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_ip(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        set_rocky_centos_ip
    else
        set_ubuntu_ip
    fi
}

set_dual_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 "请输入子网掩码位数: " C_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " C_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=${C_PREFIX}
GATEWAY=${GATEWAY}
DNS1=223.5.5.5
DNS2=180.76.76.76
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=${C_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}/${C_PREFIX},${GATEWAY}
dns=223.5.5.5;180.76.76.76;
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}/${C_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 "请输入子网掩码位数: " U_PREFIX
    while true; do
        read -p "请输入网关地址: " GATEWAY
        check_ip ${GATEWAY}
        [ $? -eq 0 ] && break
    done
    while true; do
        read -p "请输入第二块网卡IP地址: " IP2
        check_ip ${IP2}
        [ $? -eq 0 ] && break
    done
    read -p "请输入子网掩码位数: " U_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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${U_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}/${U_PREFIX}] 
      gateway4: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${U_PREFIX2}] 
EOF
    else
        cat > /etc/netplan/00-installer-config.yaml <<-EOF
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses: [${IP}/${U_PREFIX}] 
      routes:
        - to: default
          via: ${GATEWAY}
      nameservers:
        addresses: [223.5.5.5, 180.76.76.76]
    eth1:
      dhcp4: no
      dhcp6: no
      addresses: [${IP2}/${U_PREFIX2}] 
EOF
    fi
    ${COLOR}"${OS_ID} ${OS_RELEASE} IP地址、网关地址和DNS已修改成功,请重新启动系统后生效!"${END}
}

set_dual_ip(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        set_dual_centos_ip
    else
        set_dual_ubuntu_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
}

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

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

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_MIRROR=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_MIRROR} == "aliyun" -o ${MIRROR_MIRROR} == "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
    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)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_yum_rocky9
            ;;
        2)
            netease
            set_yum_rocky9
            ;;
        3)
            sohu
            set_yum_rocky9
            ;;
        4)
            nju
            set_yum_rocky9
            ;;
        5)
            ustc
            set_yum_rocky9
            ;;
        6)
            sjtu
            set_yum_rocky9
            ;;
        7)
            pku
            set_yum_rocky9
            ;;
        8)
            xjtu
            set_yum_rocky9
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${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
    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)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_devel_rocky9
            ;;
        2)
            netease
            set_devel_rocky9
            ;;
        3)
            sohu
            set_devel_rocky9
            ;;
        4)
            nju
            set_devel_rocky9
            ;;
        5)
            ustc
            set_devel_rocky9
            ;;
        6)
            sjtu
            set_devel_rocky9
            ;;
        7)
            pku
            set_devel_rocky9
            ;;
        8)
            xjtu
            set_devel_rocky9
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${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_MIRROR=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_MIRROR} == "aliyun" -o ${MIRROR_MIRROR} == "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
    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)退出
EOF
        echo -e '\E[0m'

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

set_powertools_rocky8(){
    MIRROR_MIRROR=`echo ${MIRROR} | awk -F"." '{print $2}'`
    if [ ${MIRROR_MIRROR} == "aliyun" -o ${MIRROR_MIRROR} == "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
    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)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-9): " NUM
        case ${NUM} in
        1)
            aliyun
            set_powertools_rocky8
            ;;
        2)
            netease
            set_powertools_rocky8
            ;;
        3)
            sohu
            set_powertools_rocky8
            ;;
        4)
            nju
            set_powertools_rocky8
            ;;
        5)
            ustc
            set_powertools_rocky8
            ;;
        6)
            sjtu
            set_powertools_rocky8
            ;;
        7)
            pku
            set_powertools_rocky8
            ;;
        8)
            xjtu
            set_powertools_rocky8
            ;;
        9)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-9)!"${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)
            netease
            set_yum_centos_stream9
            ;;
        6)
            nju
            set_yum_centos_stream9
            ;;
        7)
            ustc
            set_yum_centos_stream9
            ;;
        8)
            pku
            set_yum_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/\$stream/BaseOS/\$basearch/os/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

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

[extras]
name=extras
baseurl=https://${MIRROR}/centos/\$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)西安交通大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " 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)
            netease
            set_yum_centos_stream8
            ;;
        6)
            nju
            set_yum_centos_stream8
            ;;
        7)
            ustc
            set_yum_centos_stream8
            ;;
        8)
            pku
            set_yum_centos_stream8
            ;;
        9)
            xjtu
            set_yum_centos_stream8
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_powertools_centos_stream8(){
    cat > /etc/yum.repos.d/powertools.repo <<-EOF
[PowerTools]
name=PowerTools
baseurl=https://${MIRROR}/centos/\$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)西安交通大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " 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)
            netease
            set_powertools_centos_stream8
            ;;
        6)
            nju
            set_powertools_centos_stream8
            ;;
        7)
            ustc
            set_powertools_centos_stream8
            ;;
        8)
            pku
            set_powertools_centos_stream8
            ;;
        9)
            xjtu
            set_powertools_centos_stream8
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_epel_rocky_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_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)北京大学镜像源
10)西安交通大学镜像源
11)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-11): " NUM
        case ${NUM} in
        1)
            aliyun
            set_epel_rocky_centos8_9
            ;;
        2)
            huawei
            set_epel_rocky_centos8_9
            ;;
        3)
            tencent
            set_epel_rocky_centos8_9
            ;;
        4)
            tuna
            set_epel_rocky_centos8_9
            ;;
        5)
            sohu
            set_epel_rocky_centos8_9
            ;;
        6)
            nju
            set_epel_rocky_centos8_9
            ;;
        7)
            ustc
            set_epel_rocky_centos8_9
            ;;
        8)
            sjtu
            set_epel_rocky_centos8_9
            ;;
        9)
            pku
            set_epel_rocky_centos8_9
            ;;
        10)
            xjtu
            set_epel_rocky_centos8_9
            ;;
        11)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-11)!"${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; }
    cat > /etc/yum.repos.d/base.repo <<-EOF
[base]
name=base
baseurl=https://${MIRROR}/centos/\$releasever/os/\$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-\$releasever

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

[updates]
name=updates
baseurl=https://${MIRROR}/centos/\$releasever/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)西安交通大学镜像源
10)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-10): " 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)
            netease
            set_yum_centos7
            ;;
        6)
            nju
            set_yum_centos7
            ;;
        7)
            ustc
            set_yum_centos7
            ;;
        8)
            pku
            set_yum_centos7
            ;;
        9)
            xjtu
            set_yum_centos7
            ;;
        10)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-10)!"${END}
            ;;
        esac
    done
}

set_epel_centos7(){
    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/\$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/\$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/\$basearch/
gpgcheck=1
gpgkey=https://${MIRROR}/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)腾讯镜像源
4)清华镜像源
5)搜狐镜像源
6)南京大学镜像源
7)中科大镜像源
8)上海交通大学镜像源
9)北京大学镜像源
10)西安交通大学镜像源
11)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-11): " NUM
        case ${NUM} in
        1)
            aliyun
            set_epel_centos7
            ;;
        2)
            huawei
            set_epel_centos7
            ;;
        3)
            tencent
            set_epel_centos7
            ;;
        4)
            tuna
            set_epel_centos7
            ;;
        5)
            sohu
            set_epel_centos7
            ;;
        6)
            nju
            set_epel_centos7
            ;;
        7)
            ustc
            set_epel_centos7
            ;;
        8)
            sjtu
            set_epel_centos7
            ;;
        9)
            pku
            set_epel_centos7
            ;;
        10)
            xjtu
            set_epel_centos7
            ;;
        11)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-11)!"${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_centos8_9_epel_menu
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "9" ];then
                rocky9_devel_menu
            fi
            ;;
        4)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                rocky8_powertools_menu
            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 8 PowerTools仓库
4)退出
EOF
        echo -e '\E[0m'

        read -p "请输入镜像源编号(1-4): " 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} == "8" -o ${OS_RELEASE_VERSION} == "9" ];then
                rocky_centos8_9_epel_menu
            else
                centos7_epel_menu
            fi
            ;;
        3)
            if [ ${OS_RELEASE_VERSION} == "8" ];then
                centos_stream8_powertools_menu
            fi
            ;;
        4)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-4)!"${END}
            ;;
        esac
    done
}

set_apt(){
    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
    ${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)中科大镜像源
9)北京大学镜像源
10)西安交通大学镜像源
11)退出
EOF
        echo -e '\E[0m'

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

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

rocky_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_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} == "CentOS" -o ${OS_ID} == "Rocky" ] &> /dev/null;then
        rocky_centos_minimal_install
    else
        ubuntu_minimal_install
    fi
}

disable_firewall(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];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}
    else
        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}
    fi
}

disable_selinux(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];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 ];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(){
    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_tw_recycle = 0
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
    sysctl -p &> /dev/null
    ${COLOR}"${OS_ID} ${OS_RELEASE} 优化内核参数成功!"${END}
}

optimization_sshd(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];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
    systemctl restart sshd
    ${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
    ${COLOR}"${OS_ID} ${OS_RELEASE} 更改SSH端口号已完成,请重启系统后生效!"${END}
}

set_centos_alias(){
    ETHNAME=`ip addr | awk -F"[ :]" '/^2/{print $3}'`
    ETHNAME2=`ip addr | awk -F"[ :]" '/^3/{print $3}'`
    read -p "请输入网卡数量(例如: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_alias(){
    if [ ${OS_ID} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        if grep -Eqi "(.*cdnet|.*vie0|.*vie1|.*scandisk)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d'  -e '/.*vie0/d' -e '/.*vie1/d' -e '/.*scandisk/d' ~/.bashrc
            set_centos_alias
        else
            set_centos_alias
        fi
    fi
    if [ ${OS_ID} == "Ubuntu" ];then
        if grep -Eqi "(.*cdnet|.*scandisk)" ~/.bashrc;then
            sed -i -e '/.*cdnet/d' -e '/.*scandisk/d' ~/.bashrc
            set_ubuntu_alias
        else
            set_ubuntu_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} == "CentOS" -o ${OS_ID} == "Rocky" ];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]"
}

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

ubuntu_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} == "CentOS" -o ${OS_ID} == "Rocky" ];then
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            centos_ps1
        else
            centos_ps1
        fi
    fi
    if [ ${OS_ID} == "Ubuntu" ];then
        if grep -Eqi "^PS1" ~/.bashrc;then
            sed -i '/^PS1/d' ~/.bashrc
            ubuntu_ps1
        else
            ubuntu_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_root_login(){
    read -p "请输入密码: " PASSWORD
    echo ${PASSWORD} |sudo -S sed -ri 's@#(PermitRootLogin )prohibit-password@\1yes@' /etc/ssh/sshd_config
    sudo systemctl restart sshd
    sudo -S passwd root <<-EOF
${PASSWORD}
${PASSWORD}
EOF
    ${COLOR}"${OS_ID} ${OS_RELEASE} root用户登录已设置完成,请重新登录后生效!"${END}
}

ubuntu_remove(){
    apt purge ufw lxd lxd-client lxcfs liblxc-common
    ${COLOR}"${OS_ID} ${OS_RELEASE} 无用软件包卸载完成!"${END}
}

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

        read -p "请选择相应的编号(1-26): " 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_root_login
            ;;
        23)
            ubuntu_remove
            ;;
        24)
            reboot
            ;;
        25)
            shutdown -h now
            ;;
        26)
            break
            ;;
        *)
            ${COLOR}"输入错误,请输入正确的数字(1-26)!"${END}
            ;;
        esac
    done
}

main(){
    os
    menu
}

main

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

请将图转换成以某个结点为根结点的树

题目要求&#xff1a;请将图转换为以某个结点为根结点的数。然后&#xff0c;输出所有从根结点到叶子结点的路径。 例如&#xff1a; 示例输入&#xff0c; 6 0 1 1 2 1 4 3 4 4 5期望输出&#xff0c; 1 0 1 2 1 4 3 1 4 5 解题思路1&#xff1a;创建一个全局布尔型数组…

煤老板自述三十年

《煤老板自述三十年》 这本书是一位煤老板站在他的角度与高度为读者所描写的他们眼中的社会与江湖&#xff0c;大胆、真实、开拓眼界。这本书讲述了很多真相&#xff0c;它无所不包&#xff0c;充满了各种江湖气息。煤老板们身为财富领军人物&#xff0c;经历过我们大部分人难…

基于Java技术的选课管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Vue3.0在软件开发中的能力展示

经过技术的调整与迁移之后&#xff0c;JNPF开发平台已经上线了Vue3.0版本。 JNPF是从 2014 开始研发低代码前端渲染&#xff0c;2018 年开始研发后端低代码数据模型&#xff0c;发布了JNPF开发平台。 基于SpringBootVue3的全栈开发平台&#xff0c;微服务、前后端分离架构&…

LeetCode-数组-重叠、合并、覆盖问题-中等难度

435. 无重叠区间 我认为区间类的题型&#xff0c;大多数考验的是思维能力&#xff0c;以及编码能力&#xff0c;该类题型本身并无什么算法可言&#xff0c;主要是思维逻辑&#xff0c;比如本题实际上你只需要能够总结出重叠与不重叠的含义&#xff0c;再加上一点编码技巧&#…

学生备考使用台灯到底好不好?公认好用的护眼台灯推荐

在现代生活中&#xff0c;许多学生的学习压力越来越大&#xff0c;面临的近视几率也越来越大&#xff0c;特别是初中生&#xff0c;眼睛发育还未完全&#xff0c;使用不恰当的灯光也会对眼睛造成损害&#xff0c;特别是护眼台灯。虽然护眼台灯在功能上能够提供充足、柔和的光线…

【投稿优惠|检索稳定】2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024)

2024年信息系统、工程与数字化经济国际会议(ICISEDE 2024) 2024 International Conference on Information Systems and Engineering and the Digital Economy(ICISEDE 2024) [会议简介] 2024 年信息系统、工程与数字化经济国际会议(ICISEDE 2024)将于 2024 年 1 月 20 日在厦门…

Docker 部署 2FAuth 服务

拉取最新版本的 2FAuth 镜像&#xff1a; $ sudo docker pull 2fauth/2fauth:latest在本地预先创建好 2fauth 目录, 用于映射 2FAuth 容器内的 /2fauth 目录。 使用以下命令, 在 前台 运行 2FAuth 容器: $ sudo docker run -it --rm --name 2fauth -p 10085:8000/tcp -v /ho…

【漏洞复现】FLIR AX8红外线热成像仪命令执行漏洞

漏洞描述 eledyne FLIR 设计、开发、制造以及强大的传感和意识技术。自透射热图像、可见光图像、可见频率分析、来自测量和诊断的先进威胁测量系统以及日常生活的创新解决方案。 Teledyne FLIR 提供多种产品用于政府、国防、工业和商业市场。我们的产品,紧急救援人员,军事人…

SAP UI5 walkthrough step9 Component Configuration

在之前的章节中&#xff0c;我们已经介绍完了MVC的架构和实现&#xff0c;现在我们来讲一下&#xff0c;SAPUI5的结构 这一步&#xff0c;我们将所有的UI资产从index.html里面独立封装在一个组件里面 这样组件就变得独立&#xff0c;可复用了。这样&#xff0c;无所什么时候我…

基于物联网的智能仓管理系统方案

基于物联网的智能仓管理系统方案 一、项目背景 随着企业业务的快速发展&#xff0c;传统的人工仓库管理方式已经无法满足现代企业的需求。仓库运营效率低下、货物出入库错误、库存不准确等问题不断涌现。因此&#xff0c;我们提出一个基于物联网技术的智能仓管理系统方案&…

3DMAX UV贴图修改插件安装卸载方法

3DMAX UV贴图修改插件安装卸载方法 3dMax贴图修改插件PolyUnwrapper是为纹理艺术家设计的一整套专业工具&#xff0c;尤其适用于建筑和游戏行业。 它包含许多功能&#xff0c;将大大帮助您改进UV展开的工作流程。 【主要功能特点】 -多重缝合。一次缝合多个壳 -自定义打包算…

基于ssm志愿者招募网站源码和论文

网络的广泛应用给生活带来了十分的便利。所以把志愿者招募管理与现在网络相结合&#xff0c;利用java技术建设志愿者招募网站&#xff0c;实现志愿者招募的信息化。对于进一步提高志愿者招募管理发展&#xff0c;丰富志愿者招募管理经验能起到不少的促进作用。 志愿者招募网站…

Premiere Pro 2024 新功能有哪些?视频剪辑软件PR2024更新内容及问题修复

PR软件“基于文本的编辑”中的填充词检测与批量删除功能 “基于文本的编辑”可让您检测“呃”和“嗯”填充词并批量删除它们&#xff0c;从而使您的转录文本更加准确。就像处理停顿一样&#xff0c;您可以单击填充词并将其从序列转录文本中删除。填充词与语言无关&#xff0c;…

高通CRM的v4l2驱动模型

概述下crm中v4l2框架的初始化创建流程&#xff1a; 对于CRM主设备的v4l2框架创建过程&#xff1a; 1、分配和初始化v4l2 device对象 2、分配和初始化media device对象&#xff0c;然后将v4l2 device中mdev绑定到media device上 3、分配和初始化video device对象&#xff0c…

基于OpenCV的人脸识别系统案例

基于OpenCV的人脸识别系统案例 人脸识别简介代码实现案例应用情况 下面将介绍如何使用Python和OpenCV库构建一个简单但强大的人脸识别系统。人脸识别是计算机视觉领域的一个重要应用&#xff0c;具有广泛的实际用途&#xff0c;从安全门禁到娱乐应用。 人脸识别简介 人脸识别是…

在微信小程序中如何改变默认打开的页面

在微信小程序中&#xff0c;在我们编写页面的时候&#xff0c;可能会在重新渲染的时候导致页面跳转到默认打开的页面上&#xff0c;为了提升用户的一个体验&#xff0c;我们可以设置一些内容来修改小程序默认打开的页面&#xff0c;提升开发者的开发体验。 当我们打开一个微信…

字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现

文章目录 &#x1f680;前言&#x1f680;库函数strlen✈️strlen的模拟实现 &#x1f680;库函数strcpy✈️strcpy的模拟实现 &#x1f680;strcmp✈️strcmp的模拟实现 &#x1f680;strstr✈️strstr的模拟实现 &#x1f680;strcat✈️strstr的模拟实现 &#x1f680;前言 …

模型能力赋能搜索——零样本分类(Zero-Shot Classification)在搜索意图识别上的探索

什么是Zero-Shot Classification https://huggingface.co/tasks/zero-shot-classification hugging face上的零样本分类模型 facebook/bart-large-mnli https://huggingface.co/facebook/bart-large-mnli 当然这是一个英文模型&#xff0c;我们要去用一些多语言的模型。 可以在…

单片机双机通信控制跑马灯

实验要求 两个单片机各驱动8个LED灯&#xff0c;构成两个跑马灯&#xff0c;要求甲单片机LED的点亮方式是从上至下&#xff0c;首先是最上面第一个点亮、其次是前两个点亮、其次是前三个点亮……直至8个灯全部点亮&#xff0c;8个灯全部灭&#xff0c;重复这个过程&#xff0c…