#!/bin/bash
# date: 2024-1-7  version: v1.3-1
# Author: Arthur
# Mail: busyops@outlook.com


#############################################################
#################更新日志#####################
# 2023-12-18 修改数组比较方式，删掉grep过滤，添加comm命令进行数组比较差异
# 2023-12-22 完成交互面（除添加IP功能外）
# 2024-1.8 实现Centos 7.x IP功能添加
# 2024-2.1 实现Ubuntu 16-22，Debian 8-10添加ip功能


#### 自删配置段

auto_delete=0
auto_Delete_Configuration () {

    if [[ auto_delete -eq 1 ]]; then
        echo "Auto clear, Bye Bye."
        rm -f $0
        exit 0

    else
        echo "Bye Bye."
        exit 0
    fi

}

#####  一、菜单界面

#### 1.1  开屏界面

start_Out_Info_Title () {
    clear
    echo -e "\n"
    echo -e "\033[32;1mRak_Smart Kit\033[0m"
    echo -e "\033[1m                       --v1.3-1\033[0m"
}


start_Out_Option () {
    
    option_List=(

        "1. 查看机器硬件信息"
        "2. 查看链接状态信息"
        "3. 查看机器IP信息"
        "4. 添加IP地址"
        "5. 修改远程端口"
        "6. 修改系统时区"
        "q. 退出"

    )

    for i in {0..6}; do

        echo -e "${option_List[$i]}\n"

    done

    echo -e "\033[32m--------------------------------------\033[0m\n"
    read -t 60 -p '请输入对应的序号: ' want

    [ -z $want ] && want='q'

 }
   

####  1.2 子菜单下一步界面 生效于机器信息、链接状态、机器IP信息
next_Page () {

    if [ $again_Output -eq 1 ]; then
        echo "1: 返回上一级"
        echo "2: 重新测试"
        echo "3: 退出脚本"
    fi

    read -p '请输入序号：' next_Want

    [ -z $next_Want ] && next_Want=8
    [ $next_Want == 'q' ] && next_Want=1

    case $next_Want in

    1)
        incycle=2
        ;;

    2)
        again_Test=1
        again_Output=1
        ;;

    3)
        auto_Delete_Configuration
        ;;

    *)
        echo "输入错误，请重新输入"
        again_Test=2
        again_Output=2
        ;;

    esac

}

#####  1.3  列表末尾打印

sub_Footer_Out () {

    echo -e "\n\n\n\n"
    echo -e "\033[32m--------------------------------------------------------\033[0m\n"

}


#####  1.4  进入循环控制 ###

in_Cycle () {

    incycle=1
    again_Test=1
    again_Output=1
    
    while [ $incycle -eq 1 ]; do

        if [ $again_Test -eq 1 ]; then
            clear
            $1
        fi
                
        $2
            
    done

}

in_Cycle_For_Ip () {

    incycle=1
    again_Test=1
    again_Output=1
    while [ $incycle -eq 1 ]; do
        
        $1
        $2

    done

}

##### 二、功能实现

##### 2.1 ##########    硬件信息统计  #########################
hardware_Info () {

    start_Out_Info_Title

    cpu_Name=$(lscpu | awk '/^Model name:/{$1=""; $2=""; print $0}' | awk -F@ '{print $1}' | xargs)
    cpu_Count=$(lscpu | awk '/Socket/{print $2}')
    per_Cpu_Core_Count=$(lscpu | awk '/Core\(s\) per socket/{print $NF}')
    per_Core_Thread_Count=$(lscpu | awk '/Thread\(s\) per core/{print $NF}')
    total_Core_Thread_Count=$(lscpu | awk '/^CPU\(s\)/{print $NF}')

###########   mem info  #########

    total_Mem=$(free -h | awk '/^Mem/{print $2}')
    used_Mem=$(free -h| awk '/^Mem/{print $3}')
    total_Swap=$(free -h | awk '/Swap/{print $2}')
    used_Swap=$(free -h | awk '/Swap/{print $3}')


###########  disk info  #########

    disk_Count=$(df -h | grep -c "^/dev/")
    disk_List=($(df -h | awk '/^\/dev\//{print}'))

###########  hardware_outpu ################

    echo -e "\033[32m--- CPU 信息        ------------------------------------\033[0m"
    echo "CPU型号:!$cpu_Name" | awk -F! '{printf "%-17s %s\n",$1,$2}'
    echo "CPU个数:-$cpu_Count" | awk -F- '{printf "%-17s %d\n",$1,$2}'
    echo "单CPU核心数:-$per_Cpu_Core_Count" | awk -F- '{printf "%-15s %d\n",$1,$2}'
    echo "单核心线程数:-$per_Core_Thread_Count" | awk -F- '{printf "%-13s %d\n",$1,$2}'
    echo "总线程数:-$total_Core_Thread_Count" | awk -F- '{printf "%-15s %d\n",$1,$2} END {printf "\n"}'

    echo -e "\033[32m--- 内存信息        ------------------------------------\033[0m"
    echo "内存信息:-总量:-${total_Mem}-已用:-$used_Mem" | awk -F- '{printf "%-15s %-s %-5s %5s %s\n",$1,$2,$3,$4,$5}'
    echo "Swap:-总量:-${total_Swap}-已用:-$used_Swap" | awk -F- '{printf "%-19s %-s %-5s %5s %s\n",$1,$2,$3,$4,$5} END{printf "\n"}'

    echo -e "\033[32m--- 分区信息        ------------------------------------\033[0m"
    echo ${disk_List[@]} | xargs -n 6 | awk 'BEGIN{print "分区                总量   已用   挂载点"}{printf "%-19s %-6s %-7s %s\n",$1,$2,$3,$NF}END{printf "\n"}'

    sub_Footer_Out
    
}

#####  2.2  链接状态信息 ###########
link_State () {

    start_Out_Info_Title

    echo -e "\033[32m--- 链接状态信息    ------------------------------------\033[0m"
    ss_All_State=($(ss -tan | egrep -v "(^State|^LISTEN)" | awk -F: '{print $1,$2}'))
    ss_All_Type=($(echo ${ss_All_State[@]} | xargs -n 6 | awk '{state[$1]++} END{for(i in state) print i,state[i]}' | sort))

    for i in $(seq 0 2 $((${#ss_All_Type[@]}-1)));do
        
        echo "${ss_All_Type[$i]} ${ss_All_Type[$i+1]}" | awk '{printf "链接状态：\033[1m%-13s\033[0m  处于此状态的链接个数：\033[1m%s\033[0m\n",$1,$2}'
        echo "${ss_All_State[@]}" | xargs -n 6| awk "/${ss_All_Type[$i]}/{print}" | xargs -n 6 | awk '{ip[$NF]++} END{for(i in ip) printf "IP: %-19s  链接个数：%s\n",i,ip[i]}'
        [[ $i -eq $((${#ss_All_Type[@]}-2)) ]] || echo -e "\033[32m--------------------------------------------------------\033[0m\n"

    done

    sub_Footer_Out

}

#####  2.3  IP信息统计 ########################

ip_Info () {

    start_Out_Info_Title
    echo -e "\033[32m--- IP信息          ------------------------------------\033[0m"

    ip_Count=$(ip a | grep -v "127.0.0.1" | grep "\<inet\>" | wc -l)
    ip_List=($(ip a | awk '/inet /{split($2, ip, "/"); print ip[1]}' | grep -v "127.0.0.1"))

    echo "IP个数:-${ip_Count}" | awk -F- '{printf "%-17s %-5d\n",$1,$2}'

    ip_Google_List_Ok=($(echo -n ${ip_List[*]} | xargs -d' ' -n 1 -P 100  -I {} bash -c "ping -c 2 -I {} 8.8.8.8 &>/dev/null && echo {}"))
    ip_Google_List_Ok_Count=(${#ip_Google_List_Ok[@]})
    ip_Google_List_False=($(comm -3 <(printf "%s\n" "${ip_List[@]}" | sort) <(printf "%s\n" "${ip_Google_List_Ok[@]}" | sort)))
    ip_Google_List_False_Count=(${#ip_Google_List_False[@]})
    echo "测试Ping 8.8.8.8-可通:-${ip_Google_List_Ok_Count[0]}-不通:-${ip_Google_List_False_Count[0]}" | awk -F- '{printf "%-17s %-2s %-10s %-3s %-10s\n",$1,$2,$3,$4,$5}'
    
    ip_TxDns_List_Ok=($(echo -n ${ip_List[*]} | xargs -d' ' -n 1 -P 100  -I {} bash -c "ping -c 2 -I {} 119.29.29.29 &>/dev/null && echo {}"))
    ip_TxDns_List_Ok_Count=(${#ip_TxDns_List_Ok[@]})
    ip_TxDns_List_False=($(comm -3 <(printf "%s\n" "${ip_List[@]}" | sort) <(printf "%s\n" "${ip_TxDns_List_Ok[@]}" | sort)))
    ip_TxDns_List_False_Count=(${#ip_TxDns_List_False[@]})
    echo "测试Ping 腾讯DNS-可通:-${ip_TxDns_List_Ok_Count[0]}-不通:-${ip_TxDns_List_False_Count[0]}" | awk -F- '{printf "%-15s %-2s %-10s %-3s %-10s\n",$1,$2,$3,$4,$5}'
    echo


    if [[ ${ip_Google_List_False_Count} -gt 0 ]]; then
        echo -e "\033[32m--- 到8.8.8.8不通          ------------------------------------\033[0m"
        echo "${ip_Google_List_False[*]}" | xargs -n 5 | awk '{printf "%-20s%-20s%-20s%-20s%-20s\n",$1,$2,$3,$4,$5}'
        echo
    fi

    if [[ ${ip_TxDns_List_False_Count} -gt 0 ]]; then
        echo -e "\033[32m--- 到腾讯DNS不通          ------------------------------------\033[0m"
        echo "${ip_TxDns_List_False[*]}" | xargs -n 5 | awk '{printf "%-20s%-20s%-20s%-20s%-20s\n",$1,$2,$3,$4,$5}'
    fi



    

    ########## ip-info 过程输出信息控制 (debug) #######
    #echo ${ip_Google_List_Ok[@]}
    #echo
    #echo ${ip_Google_List_Ok_Count[@]}
    #echo ${ip_Google_List_False[@]}
    #echo
    #echo ${ip_Google_List_False_Count[@]}

    
    

    sub_Footer_Out

}


##### 2.4 添加IP

######## 2.4.1 探测OS版本  match_Os

match_Os () {
    
    if [ -f /etc/redhat-release ]; then
        os_Release=$(awk '{print $1,$4}' /etc/redhat-release)
    elif command -v lsb_release &>/dev/null; then
        os_Release=$(lsb_release -a 2>/dev/null | awk '/^Description/{print $2,$3}' | awk -F. '{print $1}')
    else 
        os_Release="not_supported"
        echo '不支持这个操作系统' && sleep 5
        break
    fi

    # 检查是否成功获取操作系统信息
    if [ -z "$os_Release" ]; then
        echo "无法确定操作系统" && sleep 5
        break
    fi

}

######## 2.4.2 打印添加ip使用方式  output_Ip_Modify_usage

netcard_Check () {
    
    up_Netcard_Count=$(ip a | egrep "^[[:digit:]]+.*state UP" | wc -l)
    up_Netcard_List=$(ip a | egrep "^[[:digit:]]+:[[:space:]].*state UP" | awk '{split($2, cardname, ":");print cardname[1]}')

    if [[ $up_Netcard_Count -gt 1 ]]; then

        echo "检测到存在多个状态UP的网卡, 手动选择配置到哪个网卡上:"

        for card_name in $(seq 0 1 $((${#up_Netcard_List[@]}-1))); do
            echo "$((card_name+1)): ${up_Netcard_List[$card_Nmae]}"
        done

        read -p '请选择:' card
        up_Card_Name=${up_Netcard_List[$(($card-1))]}

    elif [[ $up_Netcard_Count -eq 0 ]]; then
        echo "没有检测到UP的网卡, 请手动排查问题" && sleep 5
        break

    else 
        up_Card_Name=$(ip a | egrep "state UP"  | awk -F: '{print $2}' | xargs)
    fi

}

output_Ip_Modify_usage () {
clear
start_Out_Info_Title
netcard_Check

if [ $again_Output -eq 1 ]; then

echo -e "\n\033[32m---  添加IP功能的使用方式  ---------------------------------------------------------------------------------------------\033[0m
【Single IP】 输入IP及其所在子网的掩码

- IP/Prefix: 192.168.1.1/24
- IP/Netmask:192.168.1.1/255.255.255.0

【连续IP】 输入IP-IP及其所在子网的掩码

- IP-IP/Prefix: 192.168.1.1-20/25
- IP/Netmask: 192.168.1.1-20/255.255.255.0

【整C IP】 输入整C网络地址及其掩码

- IP/Prefix: 192.168.1.0/24
- IP/Netmask: 192.168.1.0/255.255.255.0

上述三种IP类型可混合输入、Prefix和Netmask也可混合输入，多个待添加的IP使用空格分割、掩码的取值范围24-30|255.255.255.0-252
\033[32m-------------------------------------------------------------------------------------------------------------------------\033[0m\n"

fi

}

######## 2.4.3 开屏下一步  next_Want_Ip_1


next_Want_Ip_1 () {

echo "1: 返回上一级
2: 重启网卡
3: 退出脚本"



read -t 240 -p '输入符合格式的待添加IP信息或对应选项序号: ' want_Ipaddress

[[ $want_Ipaddress == 'q' ]] && $want_Ipaddress=1
[[ -z $want_Ipaddress ]]  && want_Ipaddress='1'

match_Prefix=2
match_Address=2
again_Output=2

case $want_Ipaddress in

1)
    incycle=2
    ;; 

2)
    restart_Network
    again_Output=1
    ;;

3)
    auto_Delete_Configuration
    ;;

invalid)
    echo "输入错误，请重新输入"
    again_Output=2
    ;;

*)
    match_Prefix=1
    again_Output=1
    match_AddPre
    ;;

esac

}


######## 2.4.4 判断IP是否符合要求 match_AddPre

match_AddPre () {

output_Ip_Modify_usage

want_Ipaddress=($(echo "$want_Ipaddress"))

###### 判断掩码是否合规，合规则继续判断IP ######

[[ $match_Prefix -eq 1 ]] && for i in $(seq 0 1 $((${#want_Ipaddress[@]}-1))); do

    error_Info=''
    match_Address=2
    ip_True=2
    prefix_True=2

    prefix=$(echo "${want_Ipaddress[$i]}" | awk -F/ '{print $2}')
    
    if [[ $prefix =~ ^255\.255\.255\.(0|128|192|224|240|248|252)+$ ]]; then

        prefix_4=$(echo $prefix | awk -F. '{print $4}')
        for cycle in {1..8}; do
            [ $prefix_4 -eq $((256-2**$cycle)) ] && prefix=$((32-$cycle)) && modulu=$((2**$cycle))
        done
        prefix_True=1 && match_Address=1

    elif [[ $prefix -ge 24 && $prefix -le 30 ]] &>/dev/null ; then
        for cycle in {1..8}; do
            [[ $prefix -eq $((32-$cycle)) ]] && modulu=$((2**$cycle))
        done
        
        prefix_True=1 && match_Address=1
    
    else
        prefix_True=2 && error_Info='无法识别掩码信息' && ip_Type='bad'

    fi

######### 掩码合格则继续判断IP ##########

    #### single IP 和 整C ip判断
    [[ $match_Address -eq 1 ]] && address=$(echo "${want_Ipaddress[$i]}" | awk -F/ '{print $1}' )      &&  \
    if [[ $address =~ ^((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-3])$ ]]; then

        host_Address=$(echo "$address" | awk -F. '{print $4}')
        network_Address=$(echo "$address" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')

        if [[ $((host_Address%modulu)) -eq 0 ]]; then
            ip_Type='overoall' && ip_True=1 && C="$((256/$modulu))C"
            network="$address"  
            gateway="${network_Address}$((host_Address+modulu-2))"
            broadcast=$(echo $network_Address$((host_Address+modulu-1)))
            ip_Num="$((modulu-3))"

        elif [[ $((host_Address%modulu)) -ge $((modulu-2)) ]]; then
            ip_True=2 && error_Info='ip错误，此IP是这段的网关位或广播位'
    
        else
            network="${network_Address}$((host_Address/modulu*modulu))"  
            gateway="${network_Address}$((host_Address/modulu*modulu+modulu-2))"
            broadcast="${network_Address}$((host_Address/modulu*modulu+modulu-1))"
            ip_Type='singleIP' && ip_True=1

        fi
    ##### 多IP 判断
    elif [[ $address =~ ^((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-3])-(1?[0-9][0-9]?|2[0-4][0-9]|25[0-3])$ ]]; then
        host_Address_Min=$(echo "$address" | awk -F. '{print $4}' | awk -F- '{print $1}')
        host_Address_Max=$(echo "$address" | awk -F. '{print $4}' | awk -F- '{print $2}')
        
        true_Min=$((host_Address_Min/modulu*modulu+1))
        true_Max=$((true_Min+modulu-4))
         
        network_Address=$(echo "$address" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')

        if [[ $host_Address_Min -ge $host_Address_Max ]]; then
            ip_Type='bad' && error_Info='多IP识别错误, 请把最小值写在前面'

        elif [[ $host_Address_Min -ge $true_Min && $host_Address_Max -le $true_Max ]]; then
            ip_Type='multi' && ip_True=1
            network="${network_Address}$((true_Min-1))"  
            gateway="${network_Address}$((true_Max+1))"
            broadcast="${network_Address}$((true_Max+2))"
            ip_Num=$((host_Address_Max-host_Address_Min+1))

        else
            ip_Type='bad' && ip_True=2 && error_Info='你填写的多IP超出了这段的可配置范围'
        fi

    else
        ip_Type='bad' && ip_True=2 && error_Info='无法识别这段IP'

    fi
###### 分类存储
    if [[ $ip_Type == 'singleIP' ]]; then
        singleIP[${#singleIP[@]}]="$address $prefix $network $gateway $broadcast"

    elif [[ $ip_Type == 'overoall' ]]; then
        overoall[${#overoall[@]}]="$address $prefix $C $gateway $broadcast $ip_Num"
    
    elif [[ $ip_Type == 'multi' ]]; then
        multi[${#multi[@]}]="$address $prefix $network $gateway $broadcast $ip_Num"

    else 
        badip[${#badip[@]}]="${want_Ipaddress[$i]} $error_Info"
    
    fi
done


###### 计算各类IP个数

commit_Ip_Sum=$((${#singleIP[@]}+${#overoall[@]}+${#multi[@]}+${#badip[@]}))
commit_Ture_Ip_Sum=$((${#singleIP[@]}+${#overoall[@]}+${#multi[@]}))
single_Ip_Count=${#singleIP[@]}
overoall_Ip_Count=${#overoall[@]}
multi_Ip_Count=${#multi[@]}
badip_Count=${#badip[@]}

###### 分类输出 #####

if [[ $commit_Ip_Sum -gt 0 ]]; then

    echo -e "你一共输入了${commit_Ip_Sum}个IP地址 | \033[32m正确识别${commit_Ture_Ip_Sum}个\033[0m |  \033[31m无法识别${badip_Count}个\033[0m"

    echo
    
    serial=1
    
    [[ ${#singleIP[@]} -gt 0 ]] &&  awk 'BEGIN{print "---- Single IP ----"}' && for output_Ip in $(seq 0 1 $((${#singleIP[@]}-1))); do
        echo -n "(${serial})  " && echo "${singleIP[$output_Ip]}" | xargs -n 5 |  \
        awk '{printf "%s/%-5s 网络地址：%-15s 网关：%-15s 广播：%s\n",$1,$2,$3,$4,$5}' && let serial++
    done && echo


    [[ ${#overoall[@]} -gt 0 ]] && awk  'BEGIN{print "---- 站群 IP ----"}' && for output_Ip in $(seq 0 1 $((${#overoall[@]}-1))); do
        echo -n "(${serial})  " && echo "${overoall[$output_Ip]}" | xargs -n 6 |      \
        awk '{printf "%s/%-5s  类型：%-5s 网关：%-15s 广播：%-15s 可用IP数：%s\n",$1,$2,$3,$4,$5,$6;serial++}' && let serial++
    done && echo


    [[ ${#multi[@]} -gt 0 ]] && awk  'BEGIN{print "---- 连续 IP ----"}' && for output_Ip in $(seq 0 1 $((${#multi[@]}-1))); do
        echo -n "(${serial})  " && echo "${multi[$output_Ip]}"  | xargs -n 6 |    \
    awk '{printf "%s/%-5s  网络地址：%-5s 网关：%-15s 广播：%-15s 可用IP数：%s\n",$1,$2,$3,$4,$5,$6;}' && let serial++
    done && echo


    [[ ${#badip[@]} -gt 0 ]] && awk  'BEGIN{print "---- 无法正确识别的IP ----"}' && for output_Ip in $(seq 0 1 $((${#badip[@]}-1))); do
        echo -n "(${serial})  " && echo "${badip[$output_Ip]}" | xargs -n 2 |    \
        awk '{printf "%-15s  错误原因：%-s\n",$1,$2}' && let serial++
    done && echo

fi
echo -e "-------------------------------------------------------------------------------------------------------------------------
1. 返回上一级
2. 仅重新输入无法识别的IP (不用再次输入正确识别的IP)
3. 配置正确识别的IP (Single IP --> 网卡配置文件 | 连续IP、站群IP --> 以range形式配置)
4. 退出脚本"

read -t 240 -p '请输入对应的序号: ' next_Want

[[ -z $next_Want ]] && next_Want=1

######## 识别ip后下一步操作

case $next_Want in

1) 
    unset singleIP
    unset multi
    unset overoall
    unset badip
    incycle=2
    ;;

2)
    unset badip
    incycle=1
    again_Output=1
    ;;

3)
    match_Os
    if [[ $os_Release =~ 'CentOS' ]]; then
        Configuration_Ip_Centos

    elif [[ $os_Release =~ ('Ubuntu 16'|'Debian GNU/Linux') ]]; then
        Configuration_Ip_Ubuntu_16

    elif [[ $os_Release =~ ('Ubuntu 18'|'Ubuntu 20'|'Ubuntu 22') ]]; then
        echo $os_Release
        Configuration_Ip_Ubuntu_20

    else
        echo
    fi
    ;;

4)
    auto_Delete_Configuration
    ;;
esac

}





######## Centos 7.x IP配置段

Configuration_Ip_Centos () {


### 取值段
modify_Time=$(date "+%Y-%m-%d_%H:%M:%S")
network_Card_File="ifcfg-$up_Card_Name"
netcard_Cname=$(ip a | egrep "\<${up_Card_Name}:[[:digit:]]{0,}\>" | awk -F: '{print $NF}' | sort -nk1 | tail -1)
let netcard_Cname++
network_Dir="/etc/sysconfig/network-scripts/"
[[ -d ${network_Dir}bak ]] || mkdir ${network_Dir}bak

### 配置IP段
if [[ ${#singleIP[@]} -gt 0 ]]; then

    cp -a ${network_Dir}${network_Card_File} ${network_Dir}bak/${network_Card_File}.bak.${modify_Time}
    ipaddr_Num=$(egrep -o "IPADDR[[:digit:]]{0,}" ${network_Dir}${network_Card_File} | awk -FR '{print $NF}' | sort -nk 1 | tail -1)
    let ipaddr_Num++

    echo -e "\n# ----- ADD IP Time：$modify_Time -----" >> ${network_Dir}${network_Card_File}
    egrep "NM_CONTROLLED=" ${network_Dir}${network_Card_File} &>/dev/null && sed -i 's/NM_CONTROLLED=yes/NM_CONTROLLED=no/' ${network_Dir}${network_Card_File} ||  echo 'NM_CONTROLLED=no' >>  ${network_Dir}${network_Card_File}
    egrep "ARPCHECK=" ${network_Dir}${network_Card_File} &>/dev/null && sed -i 's/ARPCHECK=yes/ARPCHECK=no/' ${network_Dir}${network_Card_File} || echo 'ARPCHECK=no' >>  ${network_Dir}${network_Card_File}

    for add_Ip in $(seq 0 1 $((${#singleIP[@]}-1))); do
        ip_1=$(echo ${singleIP[$add_Ip]} | awk '{print $1}')
        prefix_1=$(echo ${singleIP[$add_Ip]} | awk '{print $2}')
        netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
        gateway_1=$(echo ${singleIP[$add_Ip]} | awk '{print $4}')

        echo "IPADDR${ipaddr_Num}=$ip_1" >> ${network_Dir}${network_Card_File}
        echo -e "NETMASK${ipaddr_Num}=$netmask_1\n" >> ${network_Dir}${network_Card_File}
        com_Single_Ip[${#com_Single_Ip[@]}]="$ip_1 $netmask_1 $gateway_1"

        let ipaddr_Num++
    done

fi

if [[ ${#multi[@]} -gt 0 ]]; then

    range_Num=$(ls ${network_Dir}${network_Card_File}-range* 2>/dev/null | egrep -o "range[[:digit:]]{0,}" | awk -Fe '{print $NF}' | sort -nk1 | tail -1)
    let range_Num++

    for add_Ip in $(seq 0 1 $((${#multi[@]}-1))); do

        start_Ip=$(echo ${multi[$add_Ip]} | awk -F- '{print $1}')
        network_Address=$(echo "${multi[$add_Ip]}" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')
        host_Address_Max=$(echo "${multi[$add_Ip]}" | awk -F- '{print $2}' | awk '{print $1}')
        prefix_1=$(echo ${multi[$add_Ip]} | awk '{print $2}')
        netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
        gateway_1=$(echo "${multi[$add_Ip]}" | awk '{print $4}')
        step=$(echo ${multi[$add_Ip]} | awk '{print $NF}')
cat >> ${network_Dir}${network_Card_File}-range${range_Num} << EOF
# ----- ADD IP Time：$modify_Time -----
IPADDR_START=$start_Ip
IPADDR_END=${network_Address}${host_Address_Max}
NETMASK=$netmask_1
ARPCHECK=no
CLONENUM_START=${netcard_Cname}
EOF
        com_Multi_Ip[${#com_Multi_Ip[@]}]="${start_Ip} ${network_Address}${host_Address_Max} ${netmask_1} ${gateway_1}"
        let range_Num++
        let netcard_Cname+=$step

    done

fi

if [[ ${#overoall[@]} -gt 0 ]]; then

    range_Num=$(ls ${network_Dir}${network_Card_File}-range* 2>/dev/null | egrep -o "range[[:digit:]]{0,}" | awk -Fe '{print $NF}' | sort -nk1 | tail -1)
    let range_Num++
    for add_Ip in $(seq 0 1 $((${#overoall[@]}-1))); do

        first_Ip=$(($(echo ${overoall[$add_Ip]} | awk '{print $1}' | awk -F. '{print $NF}' )+1))
        network_Address=$(echo "${overoall[$add_Ip]}" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')
        start_Ip=${network_Address}${first_Ip}
        host_Address_Max=$(($(echo "${overoall[$add_Ip]}" | awk '{print $4}' | awk -F. '{printf "%s",$NF}')-1))
        prefix_1=$(echo ${overoall[$add_Ip]} | awk '{print $2}')
        netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
        gateway_1=$(echo "${overoall[$add_Ip]}" | awk '{print $4}')

        

        step=$(echo ${overoall[$add_Ip]} | awk '{print $NF}')
        
cat >> ${network_Dir}${network_Card_File}-range${range_Num} << EOF
# ----- ADD IP Time：$modify_Time -----
IPADDR_START=$start_Ip
IPADDR_END=${network_Address}${host_Address_Max}
NETMASK=$netmask_1
ARPCHECK=no
CLONENUM_START=${netcard_Cname}
EOF
        com_Overoall_Ip[${#com_Overoall_Ip[@]}]="${start_Ip} ${network_Address}${host_Address_Max} ${netmask_1} ${gateway_1}"
        let range_Num++
        let netcard_Cname+=$step

    done

fi

Complete_And_Output

}

######## Ubuntu 16 IP配置段

Configuration_Ip_Ubuntu_16 () {


    ##### 取值段

    modify_Time=$(date "+%Y-%m-%d_%H:%M:%S")
   
    network_Card_File="/etc/network/interfaces"
    netcard_Cname=$(ip a | egrep "\<${up_Card_Name}:[[:digit:]]{0,}\>" | awk -F: '{print $NF}' | sort -nk1 | tail -1)
    [[ -z $netcard_Cname ]] && netcard_Cname=0 || let netcard_Cname++
    network_Dir="/etc/network/"
    [[ -d ${network_Dir}bak ]] || mkdir ${network_Dir}bak
    
    cp -a ${network_Card_File} ${network_Dir}bak/interfaces.bak.${modify_Time}
    echo -e "\n# ----- ADD IP Time: $modify_Time -----" >> ${network_Card_File}

    ####配置IP段
    if [[ ${#singleIP[@]} -gt 0 ]]; then
        
        for add_Ip in $(seq 0 1 $((${#singleIP[@]}-1))); do

            ip_1=$(echo ${singleIP[$add_Ip]} | awk '{print $1}')
            prefix_1=$(echo ${singleIP[$add_Ip]} | awk '{print $2}')
            netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
            gateway_1=$(echo ${singleIP[$add_Ip]} | awk '{print $4}')
            
            cat >> ${network_Card_File} << EOF
auto ${up_Card_Name}:${netcard_Cname}
iface ${up_Card_Name}:${netcard_Cname} inet static
   address $ip_1
   netmask $netmask_1

EOF

            com_Single_Ip[${#com_Single_Ip[@]}]="$ip_1 $netmask_1 $gateway_1"
            let netcard_Cname++
        done

    fi
    
    if [[ ${#multi[@]} -gt 0 ]]; then
   
        for add_Ip in $(seq 0 1 $((${#multi[@]}-1))); do

            start_Ip=$(echo ${multi[$add_Ip]} | awk -F- '{print $1}')
            first_Ip=$(echo ${start_Ip} | awk -F. '{print $NF}' )
            network_Address=$(echo "${start_Ip}" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')
            host_Address_Max=$(echo "${multi[$add_Ip]}" | awk -F- '{print $2}' | awk '{print $1}')
            prefix_1=$(echo ${multi[$add_Ip]} | awk '{print $2}')
            netmask_1="255.255.255.$((256-2**(32-$prefix_1)))"
            gateway_1=$(echo "${multi[$add_Ip]}" | awk '{print $4}')
        
            for add_Multi in $(seq ${first_Ip} 1 ${host_Address_Max}); do
                
                cat >> ${network_Card_File} << EOF
auto ${up_Card_Name}:${netcard_Cname}
iface ${up_Card_Name}:${netcard_Cname} inet static
    address ${network_Address}${add_Multi}
    netmask $netmask_1

EOF
            let netcard_Cname++

            done
            
            com_Multi_Ip[${#com_Multi_Ip[@]}]="${start_Ip} ${network_Address}${host_Address_Max} ${netmask_1} ${gateway_1}"

        done

        

    fi

    if [[ ${#overoall[@]} -gt 0 ]]; then

        for add_Ip in $(seq 0 1 $((${#overoall[@]}-1))); do

            first_Ip=$(($(echo ${overoall[$add_Ip]} | awk '{print $1}' | awk -F. '{print $NF}' )+1))
            network_Address=$(echo "${overoall[$add_Ip]}" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')
            start_Ip=${network_Address}${first_Ip}
            host_Address_Max=$(($(echo "${overoall[$add_Ip]}" | awk '{print $4}' | awk -F. '{printf "%s",$NF}')-1))
            prefix_1=$(echo ${overoall[$add_Ip]} | awk '{print $2}')
            netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
            gateway_1=$(echo "${overoall[$add_Ip]}" | awk '{print $4}')

            for add_overoall in $(seq ${first_Ip} 1 ${host_Address_Max}); do
                
                cat >> ${network_Card_File} << EOF
auto ${up_Card_Name}:${netcard_Cname}
iface ${up_Card_Name}:${netcard_Cname} inet static
    address ${network_Address}${add_overoall}
    netmask $netmask_1

EOF
                let netcard_Cname++

            done

            com_Overoall_Ip[${#com_Overoall_Ip[@]}]="${start_Ip} ${network_Address}${host_Address_Max} ${netmask_1} ${gateway_1}"

        done
        
    fi

    Complete_And_Output
     
}

######  Ubuntu  18.04 | 20.04 | 22.04 IP配置段
Configuration_Ip_Ubuntu_20 () {

    modify_Time=$(date "+%Y-%m-%d_%H:%M:%S")
    network_Card_File=$(ls /etc/netplan/*.yaml)
    network_Card_File_Count=$(ls /etc/netplan/*.yaml | wc -l)
    

    if [[ $network_Card_File_Count -gt 1 ]]; then
        echo "检测到存在多个网卡配置文件, 请手动处理" && sleep 3 
        break
    fi

    network_Dir="/etc/netplan/"
    [[ -d ${network_Dir}bak ]] || mkdir ${network_Dir}bak
    file=$(basename /etc/netplan/00-installer-config.yaml)
    
    cp -a ${network_Card_File} ${network_Dir}bak/${file}.bak.${modify_Time}

    modify_Info="# ----- ↑↑↑↑↑ ADD IP Time: $modify_Time ↑↑↑↑↑ -----"
    sed -i "/^[[:space:]]\+${up_Card_Name}:/G" $network_Card_File
    sed  -i "/^[[:space:]]\+${up_Card_Name}:/a \\$modify_Info"   $network_Card_File

    if [[ ${#singleIP[@]} -gt 0 ]]; then
        
        for add_Ip in $(seq 0 1 $((${#singleIP[@]}-1))); do
 
            ip_1=$(echo ${singleIP[$add_Ip]} | awk '{print $1}')
            prefix_1=$(echo ${singleIP[$add_Ip]} | awk '{print $2}')
            netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
            gateway_1=$(echo ${singleIP[$add_Ip]} | awk '{print $4}')

            ubu_Ip="      addresses: [${ip_1}/${prefix_1}]"
            sed -i "/^[[:space:]]\+${up_Card_Name}:/a \\$ubu_Ip" $network_Card_File

            com_Single_Ip[${#com_Single_Ip[@]}]="$ip_1 $netmask_1 $gateway_1"

        done

    fi
    
    if [[ ${#multi[@]} -gt 0 ]]; then
   
        for add_Ip in $(seq 0 1 $((${#multi[@]}-1))); do

            start_Ip=$(echo ${multi[$add_Ip]} | awk -F- '{print $1}')
            first_Ip=$(echo ${start_Ip} | awk -F. '{print $NF}' )
            network_Address=$(echo "${start_Ip}" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')
            host_Address_Max=$(echo "${multi[$add_Ip]}" | awk -F- '{print $2}' | awk '{print $1}')
            prefix_1=$(echo ${multi[$add_Ip]} | awk '{print $2}')
            netmask_1="255.255.255.$((256-2**(32-$prefix_1)))"
            gateway_1=$(echo "${multi[$add_Ip]}" | awk '{print $4}')


            for add_Multi in $(seq ${first_Ip} 1 ${host_Address_Max}); do

                ubu_Ip="      addresses: [${network_Address}${add_Multi}/${prefix_1}]"
                sed -i "/^[[:space:]]\+${up_Card_Name}:/a \\$ubu_Ip" $network_Card_File

            done
          
            
            com_Multi_Ip[${#com_Multi_Ip[@]}]="${start_Ip} ${network_Address}${host_Address_Max} ${netmask_1} ${gateway_1}"

        done

        

    fi

    if [[ ${#overoall[@]} -gt 0 ]]; then

        for add_Ip in $(seq 0 1 $((${#overoall[@]}-1))); do

            first_Ip=$(($(echo ${overoall[$add_Ip]} | awk '{print $1}' | awk -F. '{print $NF}' )+1))
            network_Address=$(echo "${overoall[$add_Ip]}" | awk -F. '{printf "%s.%s.%s.",$1,$2,$3}')
            start_Ip=${network_Address}${first_Ip}
            host_Address_Max=$(($(echo "${overoall[$add_Ip]}" | awk '{print $4}' | awk -F. '{printf "%s",$NF}')-1))
            prefix_1=$(echo ${overoall[$add_Ip]} | awk '{print $2}')
            netmask_1=$(echo "255.255.255.$((256-2**(32-$prefix_1)))")
            gateway_1=$(echo "${overoall[$add_Ip]}" | awk '{print $4}')

            for add_overoall in $(seq ${first_Ip} 1 ${host_Address_Max}); do
                
                ubu_Ip="      addresses: [${network_Address}${add_overoall}/${prefix_1}]"
                sed  -i "/^[[:space:]]\+${up_Card_Name}:/a \\$ubu_Ip" $network_Card_File

            done

            com_Overoall_Ip[${#com_Overoall_Ip[@]}]="${start_Ip} ${network_Address}${host_Address_Max} ${netmask_1} ${gateway_1}"

        done
        
    fi

    Complete_And_Output
    

    
    
}




#### 配置完成输出段  Complete_And_Output

Complete_And_Output () {
    
    clear
    start_Out_Info_Title
    echo -e "--------------------------------------------------------------\n
您好，新分配的IP已配置到系统中，测试通信正常，信息如下:
Hello, the newly assigned IP address has been configured in the system, and the test communication is normal. The information is as follows:"
    [[ ${#com_Single_Ip[@]} -gt 0 ]] &&  echo ${com_Single_Ip[@]} | xargs -n 3 | awk '{printf "```\nServer IP: %s\nGateway: %s\nNetmask: %s\n```\n",$1,$3,$2}'
    [[ ${#com_Multi_Ip[@]} -gt 0 ]] && echo ${com_Multi_Ip[@]} | xargs -n 4 | awk '{printf "```\nServer IP: %s - %s\nGateway: %s\nNetmask: %s\n```\n",$1,$2,$4,$3}'
    [[ ${#com_Overoall_Ip[@]} -gt 0 ]] && echo ${com_Overoall_Ip[@]} | xargs -n 4 | awk '{printf "```\nServer IP: %s - %s\nGateway: %s\nNetmask: %s\n```\n",$1,$2,$4,$3}'

    echo -e "\n\033[31m按任意键返回主菜单，记得重启网卡使IP生效！\033[0m" && read -t 120 next_Want

    case $next_Want in

        *)
        incycle=2
        unset singleIP
        unset multi
        unset overoall
        unset badip
        ;;

    esac

}


####### 重启网卡配置段
restart_Network () {

    match_Os
    if [[ $os_Release =~ 'CentOS' ]]; then
        echo -n "重启网卡中......" && systemctl restart network.service && echo -e "\033[32m[成功]\033[0m" || echo -e "\n\033[31m[失败]\033[0m"

    elif [[ $os_Release =~ ('Ubuntu 16'|'Debian GNU/Linux') ]]; then
        echo -n "重启网卡中......" && ip addr flush dev ${up_Card_Name} && systemctl restart networking.service && echo -e "\033[32m[成功]\033[0m"|| echo -e "\n\033[31m[失败]\033[0m"

    elif [[ $os_Release =~ ('Ubuntu 18'|'Ubuntu 20'|'Ubuntu 22') ]]; then
        echo -n "重启网卡中......" && netplan apply && echo -e "\033[32m[成功]\033[0m" || echo -e "\n\033[31m[失败]\033[0m"

    else
        echo
    fi

    sleep 5

}


##### 2.5  修改远程端口 

######## 2.5.1 远程端口检测
sshd_Info () {

    start_Out_Info_Title
    echo -e "\033[32m--- 修改远程端口        ------------------------------------\033[0m"

    ssh_Port_Listen=$(ss -tnlp  | grep "\<sshd\>" | awk -F: '{print $2}' | awk '{print $1}')
    ssh_Port_Config=$(grep "^Port[[:space:]][[:digit:]]\{2,6\}" /etc/ssh/sshd_config | awk '{print $2}')

    echo "本机sshd服务监听的端口为：$ssh_Port_Listen   配置文件中设置的端口为: $ssh_Port_Config"

    sub_Footer_Out

}
    
######### 2.5.2  远程端口修改
next_Page_Sshd () {

if [ $again_Output -eq 1 ]; then

    echo "1: 返回上一级"
    echo "2: 重新检查"
    echo "3: 重启sshd服务"
    echo "4: 退出脚本"

fi        

read -p "直接输入选项序号或端口号(10-65535): " next_Want

[[ $next_Want == 'q' ]] && next_Want=1
[[ $next_Want =~ ^[0-9]+$ ]] || next_Want=invalid 
            
if [ $next_Want == invalid ]; then
    echo "非法数值, 请重新输入"
    again_Test=2
    again_Output=2
        
elif [ $next_Want -eq 1 ]; then
    incycle=2
          
elif [ $next_Want -eq 2 ]; then
    again_Test=1

elif [ $next_Want -eq 3 ]; then
    systemctl restart sshd.service && echo "sshd服务重启成功，3秒后自动重新检测。" || echo "sshd服务重启失败,请手动排查问题"
    sleep 5

elif [ $next_Want -eq 4 ]; then
   auto_Delete_Configuration

elif [ $next_Want -gt 65535 ]; then
    echo "不支持65535之后的端口，请重新输入"
    again_test=2
    again_Output=2

elif [ $next_Want -lt 10 ]; then
    echo "不支持小于10的端口，请重新输入"
    again_Test=2
    again_Output=2
 
elif [ $next_Want -eq $ssh_Port_Listen ]; then
    echo "目前监听的就是${ssh_Port_Listen}端口"
    again_Output=2
    again_Test=2

elif [[ $next_Want -ge 10 && $next_Want -le 65535 ]];then
    local_Listen_Port=($(ss -tnl | awk -F: '/^LISTEN/{print $2}' | awk '{print $1}'))
    want_Port=($next_Want)
    port_Comm=($(comm -1 -2 <(printf "%s\n" ${want_Port[@]} | sort) <(printf "%s\n" ${local_Listen_Port[@]} | sort)))

    if [ ${#port_Comm[@]} -ne 0 ]; then
        echo "目前本机有监听${next_Want}端口的服务."
        again_Test=2
        again_Output=2

    else
        echo "正在修改端口...." &&  sed -i "/^Port/s/Port.*/Port ${next_Want}/" /etc/ssh/sshd_config && systemctl restart sshd.service
        [ $? -eq 0 ] && echo "远程端口修改成功，3秒后自动重新检测....." || echo "远程端口修改失败，请手动排查问题"
        iptables -I INPUT -p tcp --dport $next_Want -j ACCEPT && echo "防火墙已打开, 放行端口: $next_Want"
        again_Test=1
        again_Output=1
        sleep 5
    fi

else 

    echo "输入错误，请重新输入"
    again_Test=2
    again_Output=2
fi

}

##### 2.6  修改时区

timezones_Info () {

Count_List=("零" "一" "二" "三" "四" "五" "六" "七" "八" "九" "十")
Current_Location=$(timedatectl | awk '/Time/{print $3}')
eorw=$(timedatectl | awk -F, '/Time/{print $NF}')
eorw=${eorw:1:1}
how=$(timedatectl | awk -F, '/Time/{print $NF}')
how=${how:2:2}
how=$((10#$how))

local_time=$(date +"%Y年%m月%d日 %H时%M分")
utc_Time=$(timedatectl | awk '/Universal/{print $5}' | awk -F: '{printf "%-2s时%-2s分\n",$1,$2}')
utc_Day=$(timedatectl | awk '/Universal/{print $4}'| awk -F- '{printf "%-4s年%-2s月%-2s日\n",$1,$2,$3}')


for i in {1..10}; do

    if [ $i -eq $how ]; then
       how1="${Count_List[$i]}"
    fi

done

[ $eorw == "+" ] && eorw="东"
[ $eorw == "-" ] && eorw="西"
[[ $how -eq 10 ]] && how1=("${Count_List[10]}")
[[ $how -eq 11 ]] && how1=("${Count_List[10]}${Count_List[1]}")
[[ $how -eq 12 ]] && how1=("${Count_List[10]}${Count_List[2]}")


timezones=(
  "0"
  "1.  西十二区 (IDLW-国际换日线) UTC-12:00"
  "2.  西十一区 (SST-美属萨摩亚标准时间) UTC-11:00"
  "3.  西十区   (HST-夏威夷－阿留申标准时间) UTC-10:00"
  "4.  西九区   (AKST-阿拉斯加标准时间) UTC-09:00"
  "5.  西八区   (PST-北美太平洋标准时间) UTC-08:00 SV/LA-同为洛杉矶时区"
  "6.  西七区   (MST-北美山区标准时间) UTC-07:00"
  "7.  西六区   (CST-北美中部标准时间) UTC-06:00"
  "8.  西五区   (EST-北美东部标准时间) UTC-05:00"
  "9.  西四区   (ART-阿根廷时间) UTC-04:00"
  "10. 西三区   (GST-南乔治亚时间) UTC-03:00"
  "11. 西二区   (CVT-佛得角时间) UTC-02:00"
  "12. 西一区   (AZOT-亚速尔群岛时间) UTC-01:00"
  "13. 零时区 (WET:欧洲西部时区,GMT:格林尼治标准时间) UTC±00:00"
  "14. 东一区 (CET-中欧时间) UTC+01:00 FR机房时区"
  "15. 东二区 (EET-东欧时间) UTC+02:00"
  "16. 东三区 (MSK-莫斯科时间) UTC+03:00"
  "17. 东四区 (GST-阿拉伯标准时间) UTC+04:00"
  "18. 东五区 (AST-巴基斯坦标准时间) UTC+05:00"
  "19. 东六区 (IST-印度标准时间) UTC+06:00"
  "20. 东七区 (WAST-西亚标准时间) UTC+07:00"
  "21. 东八区 (CST-中国标准时间) UTC+08:00 HK/SG机房时区----26.SG时区"
  "22. 东九区 (JST-日本标准时间) UTC+09:00 TKY/KR机房时区---27.KR时区"
  "23. 东十区 (AEST-澳大利亚东部标准时间) UTC+10:00"
  "24. 东十一区 (VUT-瓦努阿图时间) UTC+11:00"
  "25. 东十二区 (NZST-新西兰标准时间) UTC+12:00"
)

start_Out_Info_Title
echo

printf "\033[1m系统时区：%s%s区-%s  |  系统时间：%-30s|   UTC时间：%s %s\033[0m\n" "$eorw" "${how1[@]}" "$Current_Location"  "$local_time" "$utc_Day" "$utc_Time"
echo -e "\033[32m----------------------------------------------------------------------------------------------------------\033[0m"

for i in {1..25};do

    if [ $i -eq 2 ] ||  [ $i -eq 23 ];then
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-20s\t\t  %-s\n", $1,$2,$3,$4}' 
    elif [ $i -eq 3 ]; then
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-20s\t  %-s\n", $1,$2,$3,$4}' 
    elif [ $i -eq 5 ]; then
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-20s\t\t  %-13s %s\n", $1,$2,$3,$4,$5}' 
    elif [ $i -eq 13 ]; then
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-20s  %-s\n", $1,$2,$3,$4}' 
    elif [ $i -eq 14 ]; then
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-35s  %-13s %s\n", $1,$2,$3,$4,$5}' 
    elif [ $i -eq 21 ] ||  [ $i -eq 22 ]; then
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-33s  %-13s %s\n", $1,$2,$3,$4,$5}' 
    else 
       echo ${timezones[i]} | awk '{printf "%-3s %-s\t %-30s\t  %-s\n", $1,$2,$3,$4}' 
    fi

done

echo -e "\033[32m----------------------------------------------------------------------------------------------------------\033[0m"

}

next_Page_Timezones () {


zone_Cmd_List=(
"0 0 0 0"
"1 Etc/GMT+12 国际换日线 xi 12"
"2 Pacific/Midway 美国-中途岛 xi 11"
"3 Pacific/Honolulu 美国-檀香山 xi 10"
"4 America/Juneau 美国-阿拉斯加-朱诺 xi 9"
"5 America/Los_Angeles 美国-洛杉矶 xi 8"
"6 America/Phoenix 美国-凤凰城 xi 7"
"7 America/Chicago 美国-芝加哥 xi 6"
"8 America/New_York 美国-纽约 xi 5"
"9 America/Halifax 加拿大-哈利法克斯 xi 4"
"10 America/Araguaina 巴西-阿拉瓜伊纳 xi 3"
"11 America/Noronha 巴西-迪诺罗尼亚群岛 xi  2"
"12 Atlantic/Cape_Verde 佛得角 xi 1"
"13 UTC 英国伦敦格林威治标准时间"
"14 Europe/Paris 法国-巴黎 d 1"
"15 Europe/Athens 希腊-雅典 d 2"
"16 Europe/Moscow 俄罗斯-莫斯科 d 3"
"17 Asia/Dubai 阿拉伯联合酋长国-迪拜 d 4"
"18 Asia/Karachi 巴基斯坦-卡拉奇 d 5"
"19 Asia/Dhaka 孟加拉国-达卡 d 6"
"20 Asia/Bangkok 泰国-曼谷 d 7"
"21 Asia/Hong_Kong 中国-香港 d 8"
"22 Asia/Tokyo 日本-东京 d 9"
"23 Australia/Brisbane 澳大利亚-布里斯班 d 10"
"24 Pacific/Efate 瓦努阿图 d 11"
"25 Pacific/Fiji 斐济 d 12"
"26 Asia/Singapore 新加坡 d 8"
"27 Asia/Seoul 韩国-首尔 d 8"
)

if [ $again_Output -eq 1 ] ;then

    echo "28: 返回上一级"
    echo "29: 重新检测"
    echo "30: 退出脚本"

fi

read -p "输入对应的选项序号: " next_Want

[ -z $next_Want ] && next_Want='invalid'
[[ $next_Want =~ ^[0-9]{1,2}$ ]] || next_Want='invalid'

if [ $next_Want == 'invalid' ]; then
    echo "输入错误，请重新输入."
    again_Test=2
    again_Output=2

elif [[ $next_Want =~ ^0 ]]; then
    echo "不支持以0开头, 需要使用对应序号."
    again_Test=2
    again_Output=2

elif [ $next_Want -gt 30 ]; then
    echo "不支持这个选项, 请重新输入."
    again_Test=2
    again_Output=2


elif [ $next_Want -ge 1 ] && [ $next_Want -le 27 ]; then
    modify_Timezone_Zone=$(echo ${zone_Cmd_List[$next_Want]} | awk '{print $2}')
    modify_Timezone_Name=$(echo ${zone_Cmd_List[$next_Want]} | awk '{print $3}')
    timedatectl set-timezone $modify_Timezone_Zone && echo -e "已将时区修改为\033[1m ${modify_Timezone_Name}\033[0m, 3秒后自动重新检测"
    sleep 5

elif [ $next_Want -eq 28 ]; then
    incycle=2

elif [ $next_Want -eq 29 ]; then
    again_Test=1

elif [ $next_Want -eq 30 ]; then
    auto_Delete_Configuration

else 
    echo "输入错误, 请重新输入."
    again_Test=2
    again_Output=2

fi

}

#####  三、主程序  ###########################


while true; do

    start_Out_Info_Title
    start_Out_Option

    case $want in
    1)
        in_Cycle hardware_Info next_Page
        ;;

    2)
        in_Cycle link_State next_Page
        ;;

    3)
        in_Cycle ip_Info next_Page
        ;;

    4)
        in_Cycle_For_Ip output_Ip_Modify_usage next_Want_Ip_1
        ;;

    5)
        in_Cycle sshd_Info next_Page_Sshd
        ;;

    6)
        in_Cycle timezones_Info next_Page_Timezones
        ;;

    q)
        auto_Delete_Configuration
        ;;
        
    *)
        echo "不支持这个选项！"
        ;;

    esac

done
