#!/bin/bash

# ============================================================
#  一、系统基础配置
# ============================================================

# 1. 更改阿里云软件源
update_sources1() {
    read -p "是否更新软件源到阿里云镜像？(y/n): " update_source

if [ "$update_source" == "y" ]; then
    echo "正在备份当前的sources.list文件..."
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    echo "备份完成。"

    echo "正在清空sources.list文件内容..."
    echo -n >sudo /etc/apt/sources.list
    echo "sources.list文件已清空。"

    echo "正在更新sources.list文件..."
    sudo sh -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse" > /etc/apt/sources.list'
sudo sh -c 'echo "deb-src http://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb-src http://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb-src http://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb-src http://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse" >> /etc/apt/sources.list'
sudo sh -c 'echo "deb-src http://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse" >> /etc/apt/sources.list'
    echo "sources.list文件更新完成。"
sudo timedatectl set-timezone Asia/Shanghai

    echo -e "\033[34m--------已完成--------\033[0m"
  
else
    echo "操作已取消。"
fi
}

# 2. 更新升级软件包
update_sources2() {
echo "正在更新软件包列表..."
sudo apt-get update
echo "软件包列表更新完成。"

echo "正在升级软件包列表..."
sudo apt-get upgrade

echo -e "\033[34m软件包列表更新完成。。。\033[0m"
}

# 3. 中文语言包
update_sources3() {
echo "正在安装中文语言包..."
sudo apt install -y language-pack-zh-hans language-pack-gnome-zh-hans
echo "中文语言包安装完成。"

echo "正在设置系统语言为中文..."
sudo update-locale LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh:en_US:en
echo "系统语言设置为中文。"

echo "操作完成。"
}

# 4. xrdp远程桌面（3389）
update_sources4() {
install_package() {
    echo "正在安装 $1..."
    sudo apt-get install -y $1
    if [ $? -eq 0 ]; then
        echo "$1 安装成功。"
    else
        echo "$1 安装失败。"
    fi
}

echo "时间有点长，抽根烟，喝杯茶！"
read -p "是否安装远程桌面服务 xrdp? (Y/N): " -n 1 -r
    echo

if [[ $REPLY =~ ^[Yy]$ ]]; then
sudo apt install xrdp
    echo "安装 xrdp 完成，开始安装Xubuntu 桌面环境"
    
    sudo systemctl enable xrdp
    echo "startxfce4" > ~/.xsession
    echo "设置 xrdp 会话文件完成。"
    sudo service xrdp restart
  sudo apt-get install xubuntu-desktop
   echo -e "\033[34m安装 Xubuntu 桌面环境完成。\033[0m"
    echo -e "\033[34m登录失败等bug，请卸载后重新安装。\033[0m"
     echo -e "\033[34m登录失败等bug，请卸载后重新安装。\033[0m"
   
else
    echo "已取消远程桌面服务的安装。"
fi
}

# 5. 查看ubuntu版本
update_sources5() {
    echo -e "\033[34m=== 系统信息 ===\033[0m"
    echo
    echo -e "\033[33m内核版本:\033[0m"
    uname -r
    echo
    echo -e "\033[33mCPU 架构:\033[0m"
    uname -m
    echo -e "  $(uname -p) ($(dpkg --print-architecture))"
    echo
    echo -e "\033[33m操作系统版本:\033[0m"
    cat /etc/os-release | grep -E "^(NAME|VERSION)=" | sed 's/"/ /g' | awk -F= '{printf "  %-12s %s\n", $1, $2}'
    echo
    echo -e "\033[33mUbuntu版本:\033[0m"
    lsb_release -ds 2>/dev/null || cat /etc/lsb-release | grep -E "^(DISTRIB_RELEASE|DISTRIB_CODENAME)=" | sed 's/"/ /g' | awk -F= '{printf "  %-16s %s\n", $1, $2}'
    echo
    echo -e "\033[33m当前用户:\033[0m   $(whoami)"
    echo -e "\033[33m主机名:\033[0m     $(hostname)"
    echo -e "\033[33m当前时间:\033[0m   $(date '+%Y-%m-%d %H:%M:%S %A')"
    echo
}

# 6. 添加root账户
update_sources6() {
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
sudo sed -i 's/^#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

if grep -q '^PermitRootLogin yes' /etc/ssh/sshd_config; then
    echo "PermitRootLogin已成功设置为yes。"
else
    echo "修改PermitRootLogin失败，请检查sshd_config文件。"
    exit 1
fi

systemctl restart sshd
 echo -e "\033[34msshd_config文件已更新，ssh服务已重启。\033[0m"
systemctl restart sshd

read -p "请继续修改密码，执行下一步？(y/n): " confirm
if [ "$confirm" != "y" ]; then
    echo "操作已取消。"
    exit 1
fi

echo "正在重新加载SSH服务..."
sudo systemctl reload sshd
echo "SSH服务已重新加载。"

echo "请修改root用户的密码。"
echo "请输入新的root密码："
sudo passwd root

if [ $? -eq 0 ]; then
    echo -e "\033[34mroot密码修改成功。\033[0m"
else
    echo "root密码修改失败，请检查输入。"
fi
}

# ============================================================
#  二、网络配置
# ============================================================

# 10. 网络配置（netplan）
update_sources10() {
    show_current_netplan() {
        echo -e "\033[33m--- 当前 /etc/netplan/*.yaml 配置 ---\033[0m"
        if ls /etc/netplan/*.yaml &>/dev/null; then
            sudo cat /etc/netplan/*.yaml
        else
            echo -e "\033[90m  未找到 netplan 配置文件\033[0m"
        fi
        echo
        echo -e "\033[33m--- 当前 IP 地址 ---\033[0m"
        ip -4 addr show | grep inet | awk '{print "  " $0}'
        echo
    }

    auto_config_netplan() {
        echo -e "\033[33m--- 自动配置示例（仅供参考）---\033[0m"
        cat << 'EOF'
# /etc/netplan/01-netcfg.yaml 示例（仅作参考）
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
EOF
        echo
        echo -e "\033[31m注意：云服务器请勿随意修改 netplan 配置，否则可能导致网络中断！\033[0m"
        echo
        read -p "确认应用此配置？(y/n): " confirm
        [ "$confirm" != "y" ] && echo "已取消。" && return

        read -p "请输入网卡名 [默认: ens5]: " iface
        [ -z "$iface" ] && iface="ens5"
        read -p "请输入静态IP（含CIDR，如 192.168.1.100/24）: " addr
        read -p "请输入网关IP（如 192.168.1.1）: " gw
        read -p "请输入DNS服务器 [默认: 8.8.8.8]: " dns
        [ -z "$dns" ] && dns="8.8.8.8"

        config_file="/etc/netplan/01-netcfg.yaml"
        echo -e "\033[33m正在备份当前配置...\033[0m"
        sudo cp "$config_file" "${config_file}.bak.$(date +%Y%m%d%H%M%S)" 2>/dev/null

        echo -e "\033[33m正在写入新配置...\033[0m"
        sudo tee "$config_file" > /dev/null << EONET
network:
  version: 2
  renderer: networkd
  ethernets:
    $iface:
      dhcp4: no
      addresses:
        - $addr
      gateway4: $gw
      nameservers:
        addresses:
          - $dns
          - 114.114.114.114
EONET

        echo -e "\033[34m配置已写入，正在应用...\033[0m"
        sudo netplan apply
        echo -e "\033[34m配置完成。\033[0m"
    }

    auto_dhcp_netplan() {
        echo -e "\033[33m--- 恢复 DHCP 自动获取 ---\033[0m"
        echo -e "\033[31m注意：云服务器请勿随意修改 netplan 配置，否则可能导致网络中断！\033[0m"
        echo
        read -p "确认恢复 DHCP 自动获取？(y/n): " confirm
        [ "$confirm" != "y" ] && echo "已取消。" && return

        read -p "请输入网卡名 [默认: ens5]: " iface
        [ -z "$iface" ] && iface="ens5"

        config_file="/etc/netplan/01-netcfg.yaml"
        echo -e "\033[33m正在备份当前配置...\033[0m"
        sudo cp "$config_file" "${config_file}.bak.$(date +%Y%m%d%H%M%S)" 2>/dev/null

        echo -e "\033[33m正在写入 DHCP 配置...\033[0m"
        sudo tee "$config_file" > /dev/null << EONET
network:
  version: 2
  renderer: networkd
  ethernets:
    $iface:
      dhcp4: yes
EONET

        echo -e "\033[34m配置已写入，正在应用...\033[0m"
        sudo netplan apply
        echo -e "\033[34m已恢复 DHCP 自动获取。\033[0m"
    }

    while true; do
        echo -e "\033[34m=== 网络配置（netplan）===\033[0m"
        echo "| 编号 | 功能             | 说明                              |"
        echo "| :--- | :--------------- | :-------------------------------  |"
        echo "| 901  | 查看当前配置      | 显示当前 netplan 配置及 IP 地址   |"
        echo "| 902  | 自动配置静态IP   | 交互式设置静态IP（netplan）      |"
        echo "| 903  | 恢复DHCP自动获取  | 恢复自动获取IP（netplan）        |"
        echo "| 904  | 返回             | 返回主菜单                       |"
        echo
        read -p "请选择一个操作 (901/902/903/904): " net_choice

        case $net_choice in
            901) show_current_netplan ;;
            902) auto_config_netplan ;;
            903) auto_dhcp_netplan ;;
            904) echo "返回主菜单。" ; break ;;
            *) echo -e "\033[31m无效的选择，请输入 901、902、903 或 904。\033[0m"; sleep 0.3 ;;
        esac
        echo
    done
}

# ============================================================
#  三、系统工具
# ============================================================

# 上传脚本到服务器
update_sources108() {
    echo -e "\033[34m=== 上传脚本到服务器 ===\033[0m"
    echo
    echo -e "\033[33m在本地 Windows 终端（PowerShell / CMD）执行以下命令：\033[0m"
    echo
    remote_ip=$(curl -s ifconfig.me)
    echo -e "  \033[36mscp \"C:\\Users\\zhao\\Desktop\\your_script.sh\" ubuntu@${remote_ip}:/www/wwwroot/tool.zhao.wiki/\033[0m"
    echo
    echo -e "\033[33m说明：\033[0m"
    echo "  - 将本地脚本文件上传到服务器的 /www/wwwroot/tool.zhao.wiki/ 目录"
    echo "  - 执行前请确认本地文件路径、脚本名称及服务器 IP"
    echo "  - 如果已配置 SSH 密钥，可免密上传"
    echo
}

# 修改目录所有者
update_sources107() {
    echo -e "\033[34m=== 修改目录所有者 ===\033[0m"
    echo

    read -p "请输入目录路径 [默认: /www/wwwroot]: " dir_path
    [ -z "$dir_path" ] && dir_path="/www/wwwroot"

    if [ ! -d "$dir_path" ]; then
        echo -e "\033[31m错误：目录 $dir_path 不存在。\033[0m"
        return 1
    fi

    read -p "请输入所有者用户名 [默认: $(whoami)]: " owner
    [ -z "$owner" ] && owner=$(whoami)

    read -p "请输入所属组 [默认: $owner]: " group
    [ -z "$group" ] && group=$owner

    echo
    echo -e "\033[33m即将执行:\033[0m"
    echo -e "  目录: \033[36m$dir_path\033[0m"
    echo -e "  所有者: \033[36m$owner:$group\033[0m"
    echo
    read -p "确认修改？(y/n): " confirm

    if [ "$confirm" == "y" ]; then
        sudo chown -R "$owner:$group" "$dir_path"
        if [ $? -eq 0 ]; then
            echo -e "\033[34m修改成功！\033[0m"
            echo "当前所有者:"
            ls -ld "$dir_path"
        else
            echo -e "\033[31m修改失败，请检查输入是否正确。\033[0m"
        fi
    else
        echo "操作已取消。"
    fi
    echo
}

# 7. timeshift备份还原（子菜单 701-702）
update_sources7() {
    echo "| 编号 | 功能   | 说明       |"
    echo "| :--- | :----- | :--------- |"
    echo "| 701  | 备份   | 使用timeshift备份系统 |"
    echo "| 702  | 还原   | 使用timeshift还原系统 |"
    echo "| 703  | 返回   | 返回主菜单 |"
    echo
    read -p "请选择一个操作 (701/702/703): " sub_choice

    case $sub_choice in
        701)
backup_with_timeshift() {
    echo -e "\033[34m开始备份...\033[0m"
   sudo timeshift --create --target /dev/sda3/dm-0
    if [ $? -eq 0 ]; then
        echo -e "\033[34m备份成功！\033[0m"
    else
        echo -e "\033[31m备份失败！\033[0m"
    fi
}

read -p "是否进行系统备份吗？(y/n): " backup_choice

if [ "$backup_choice" == "y" ]; then
    backup_with_timeshift
else
    echo "备份操作已取消。"
fi
            ;;
        702)
read -p "是否使用timeshift进行系统还原吗？(y/n): " confirm

if [ "$confirm" == "y" ]; then
    BLUE='\033[0;34m'
                NC='\033[0m'
    echo -e "${BLUE}开始还原系统..请根据提示操作.${NC}"
    sudo timeshift --restore

    if [ $? -eq 0 ]; then
        echo -e "${BLUE}还原成功！${NC}"
    else
        echo -e "${BLUE}还原失败，请检查timeshift日志以获取更多信息。${NC}"
    fi
else
    echo "还原操作已取消。"
fi
            ;;
        703)
            echo "返回主菜单。"
            ;;
        *)
            echo "无效的选择，请输入 701、702 或 703。"
            ;;
    esac
}

# 8. 修复依赖错误
update_sources8() {
    sudo apt-get install aptitude
    echo -e "\033[34m--------命令行输入sudo aptitude install +依赖名字修复--------\033[0m"
}

# 9. NPS穿透内网客户端
update_sources9() {
echo "一键安装"

NPC_INSTALL_SCRIPT="/root/npc_install.sh"
NPC_CONF="/root/conf/npc.conf"

wget https://bbs.lengba.net/linux_amd64_client.tar.gz -O /root/linux_amd64_client.tar.gz
tar -zxvf /root/linux_amd64_client.tar.gz -C /root

sed -i "s/server_addr=127.0.0.1:8024/server_addr=nps.lengba.net:8024/g" $NPC_CONF
sed -i "s/conn_type=tcp/conn_type=tcp/g" $NPC_CONF
sed -i "s/vkey=123/vkey=nw0159ufcgauafkw/g" $NPC_CONF

cat > $NPC_INSTALL_SCRIPT << 'EOF'
#!/bin/bash

NPC_SERVER="nps.lengba.net:8024"
NPC_VKEY="nw0159ufcgauafkw"
NPC_TYPE="tcp"

./npc install -server="$NPC_SERVER" -vkey="$NPC_VKEY" -type="$NPC_TYPE"

if [ $? -eq 0 ]; then
    echo "NPC 安装成功"
else
    echo "NPC 安装失败"
fi
EOF

chmod +x $NPC_INSTALL_SCRIPT

cat > /etc/systemd/system/npc_install.service << 'EOF'
[Unit]
Description=Run NPC install command on startup
After=network.target

[Service]
Type=oneshot
ExecStart=/root/npc_install.sh

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable npc_install.service
systemctl start npc_install.service

nohup ./npc status > npc_status.log 2>&1 &

rm npc_status.log
echo "KEY，server，端口替换YOU is"
}

# ============================================================
#  十一、清理
# ============================================================

# 11. 清理系统垃圾
update_sources11() {
    echo -e "\033[34m=== 清理系统垃圾文件 ===\033[0m"
    echo
    echo -e "\033[33m以下项目将被清理：\033[0m"
    echo "  1. apt 缓存 (/var/cache/apt/archives)"
    echo "  2. 旧内核及不再需要的软件包"
    echo "  3. 系统日志 (/var/log)"
    echo "  4. 旧 snap 版本"
    echo "  5. 缩略图缓存 (~/.cache/thumbnails)"
    echo
    read -p "确认清理？(y/n): " confirm
    [ "$confirm" != "y" ] && echo "已取消。" && return

    echo -e "\n\033[33m[1/5] 清理 apt 缓存...\033[0m"
    sudo apt clean
    echo -e "\033[32m  完成\033[0m"

    echo -e "\n\033[33m[2/5] 清理旧内核和不再需要的依赖...\033[0m"
    sudo apt autoremove -y
    echo -e "\033[32m  完成\033[0m"

    echo -e "\n\033[33m[3/5] 清理系统日志...\033[0m"
    sudo journalctl --vacuum-time=7d
    echo -e "\033[32m  完成\033[0m"

    echo -e "\n\033[33m[4/5] 清理旧 snap 版本...\033[0m"
    if command -v snap &>/dev/null; then
        snap list --all | awk '/disabled/{print $1, $3}' | while read snapname rev; do
            sudo snap remove "$snapname" --revision="$rev" 2>/dev/null
        done
        echo -e "\033[32m  完成\033[0m"
    else
        echo -e "\033[90m  未安装 snap，跳过\033[0m"
    fi

    echo -e "\n\033[33m[5/5] 清理缩略图缓存...\033[0m"
    rm -rf ~/.cache/thumbnails/*
    echo -e "\033[32m  完成\033[0m"

    echo
    echo -e "\033[34m=== 磁盘使用情况 ===\033[0m"
    df -h / | awk 'NR==2{printf "  根分区: 已用 %s / 总计 %s (使用率 %s)\n", $3, $2, $5}'
    echo
    echo -e "\033[34m清理完成！\033[0m"
}

# ============================================================
#  四、监控与诊断
# ============================================================

# 12. 系统监控
update_sources12() {
    echo -e "\033[34m=== 系统监控 ===\033[0m"
    echo

    echo -e "\033[33m[系统负载]\033[0m"
    uptime
    echo

    echo -e "\033[33m[内存使用]\033[0m"
    free -h
    echo

    echo -e "\033[33m[磁盘使用]\033[0m"
    df -h | grep -E '^/dev'
    echo

    echo -e "\033[33m[CPU 使用率 Top 10]\033[0m"
    ps aux --sort=-%cpu | head -11
    echo

    echo -e "\033[33m[内存占用 Top 10]\033[0m"
    ps aux --sort=-%mem | head -11
    echo

    echo -e "\033[33m[实时监控 (htop - q退出)]\033[0m"
    read -p "是否安装并运行 htop？(y/n): " confirm
    [ "$confirm" == "y" ] && sudo apt install -y htop && htop
}

# ============================================================
#  五、防火墙
# ============================================================

# 13. 防火墙 ufw
update_sources13() {
    install_ufw() {
        if ! command -v ufw &>/dev/null; then
            echo "正在安装 ufw..."
            sudo apt install -y ufw
        fi
    }

    auto_ufw() {
        echo -e "\033[34m=== 防火墙 (ufw) ===\033[0m"
        echo "| 编号 | 功能              | 说明                          |"
        echo "| :--- | :---------------- | :---------------------------- |"
        echo "| 001  | 查看状态          | 查看 ufw 当前状态和规则        |"
        echo "| 002  | 开启防火墙        | 启用 ufw（注意不要锁自己！）   |"
        echo "| 003  | 关闭防火墙        | 禁用 ufw                      |"
        echo "| 004  | 放行端口          | 开放指定端口（如 22/80/443）   |"
        echo "| 005  | 禁止端口          | 拒绝指定端口入站流量           |"
        echo "| 006  | 删除规则          | 按端口删除已有规则             |"
        echo "| 007  | 允许 IP           | 允许指定 IP 访问               |"
        echo "| 008  | 重置防火墙        | 回复默认设置                   |"
        echo "| 009  | 返回              | 返回主菜单                     |"
        echo
        read -p "请选择一个操作 (001-009): " ufw_choice

        case $ufw_choice in
            001)
                sudo ufw status verbose
                ;;
            002)
                echo -e "\033[31m警告：请确保已放行 SSH 端口(默认22)，否则可能断开连接！\033[0m"
                read -p "确认开启防火墙？(y/n): " c
                [ "$c" == "y" ] && sudo ufw enable && sudo ufw allow ssh && sudo ufw reload
                ;;
            003)
                read -p "确认关闭防火墙？(y/n): " c
                [ "$c" == "y" ] && sudo ufw disable
                ;;
            004)
                read -p "请输入要放行的端口（如 80 或 80/tcp）: " port
                [ -n "$port" ] && sudo ufw allow "$port" && echo -e "\033[34m端口 $port 已放行。\033[0m"
                ;;
            005)
                read -p "请输入要禁止的端口: " port
                [ -n "$port" ] && sudo ufw deny "$port" && echo -e "\033[34m端口 $port 已禁止。\033[0m"
                ;;
            006)
                read -p "请输入要删除规则的端口: " port
                [ -n "$port" ] && sudo ufw delete allow "$port" && echo -e "\033[34m端口 $port 规则已删除。\033[0m"
                ;;
            007)
                read -p "请输入要允许的 IP 地址: " ip
                [ -n "$ip" ] && sudo ufw allow from "$ip" && echo -e "\033[34mIP $ip 已允许访问。\033[0m"
                ;;
            008)
                read -p "确认重置防火墙为默认设置？(y/n): " c
                [ "$c" == "y" ] && sudo ufw reset && echo -e "\033[34m防火墙已重置。\033[0m"
                ;;
            009)
                echo "返回主菜单。"
                ;;
            *)
                echo -e "\033[31m无效的选择。\033[0m"
                 ;;
        esac
    }

    install_ufw
    auto_ufw
}

# ============================================================
#  六、用户管理
# ============================================================

# 14. 用户管理
update_sources14() {
    echo -e "\033[34m=== 用户管理 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 查看所有用户       | 列出系统所有用户               |"
    echo "| 002  | 查看活跃登录       | 查看当前在线用户               |"
    echo "| 003  | 添加用户          | 交互式添加新用户               |"
    echo "| 004  | 删除用户          | 删除指定用户（可保留家目录）   |"
    echo "| 005  | 修改用户密码       | 修改指定用户的密码             |"
    echo "| 006  | 添加 sudo 权限    | 将用户加入 sudo 组             |"
    echo "| 007  | 移除 sudo 权限    | 将用户从 sudo 组移除           |"
    echo "| 008  | 查看用户组        | 查看指定用户所属组             |"
    echo "| 009  | 返回              | 返回主菜单                     |"
    echo
    read -p "请选择一个操作 (001-009): " u_choice

    case $u_choice in
        001)
            echo -e "\033[33m所有用户：\033[0m"
            getent passwd | awk -F: '{print $1}' | column
            ;;
        002)
            who
            ;;
        003)
            read -p "请输入要添加的用户名: " uname
            [ -z "$uname" ] && echo "用户名不能为空。" && return
            sudo adduser "$uname"
            ;;
        004)
            read -p "请输入要删除的用户名: " uname
            [ -z "$uname" ] && echo "用户名不能为空。" && return
            read -p "是否同时删除家目录？(y/n): " delhome
            [ "$delhome" == "y" ] && sudo deluser --remove-home "$uname" || sudo deluser "$uname"
            ;;
        005)
            read -p "请输入要修改密码的用户名: " uname
            [ -z "$uname" ] && echo "用户名不能为空。" && return
            sudo passwd "$uname"
            ;;
        006)
            read -p "请输入要添加 sudo 权限的用户名: " uname
            [ -z "$uname" ] && return
            sudo usermod -aG sudo "$uname" && echo -e "\033[34m用户 $uname 已加入 sudo 组。\033[0m"
            ;;
        007)
            read -p "请输入要移除 sudo 权限的用户名: " uname
            [ -z "$uname" ] && return
            sudo deluser "$uname" sudo && echo -e "\033[34m用户 $uname 已从 sudo 组移除。\033[0m"
            ;;
        008)
            read -p "请输入用户名: " uname
            [ -z "$uname" ] && return
            echo -e "\033[33m用户 $uname 所属组：\033[0m"
            groups "$uname"
            ;;
        009)
            echo "返回主菜单。"
            ;;
        *)
            echo -e "\033[31m无效的选择。\033[0m"
            ;;
    esac
}

# ============================================================
#  七、磁盘管理
# ============================================================

# 15. 磁盘管理
update_sources15() {
    echo -e "\033[34m=== 磁盘管理 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 查看磁盘使用       | df -h 所有分区                |"
    echo "| 002  | 查看 inode        | 查看 inode 使用情况           |"
    echo "| 003  | 查看大文件         | 查找目录下大于指定大小的文件   |"
    echo "| 004  | 查看目录大小       | 查看各目录占用空间            |"
    echo "| 005  | 查看磁盘 IO        | 磁盘读写速度（iostat）        |"
    echo "| 006  | 查看挂载信息       | 查看所有已挂载文件系统         |"
    echo "| 007  | 返回              | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-007): " d_choice

    case $d_choice in
        001)
            df -h | grep -E '^/dev'
            echo
            echo -e "\033[33m全部分区：\033[0m"
            df -h
            ;;
        002)
            df -i
            ;;
        003)
            read -p "请输入目录路径 [默认: /]: " dir
            [ -z "$dir" ] && dir="/"
            read -p "请输入最小文件大小（如 100M, 1G）: " size
            [ -z "$size" ] && echo "大小不能为空。" && return
            echo -e "\033[33m查找 ${dir} 下大于 ${size} 的文件...\033[0m"
            sudo find "$dir" -type f -size +"$size" 2>/dev/null | head -50
            ;;
        004)
            read -p "请输入要查看的目录 [默认: /]: " dir
            [ -z "$dir" ] && dir="/"
            echo -e "\033[33m目录 ${dir} 各子目录大小（Top 20）：\033[0m"
            sudo du -sh "$dir"/* 2>/dev/null | sort -hr | head -20
            ;;
        005)
            sudo apt install -y sysstat
            echo -e "\033[33m磁盘 IO 统计（按设备）：\033[0m"
            iostat -x -d 1 3
            ;;
        006)
            mount | column -t
            ;;
        007)
            echo "返回主菜单。"
            ;;
        *)
            echo -e "\033[31m无效的选择。\033[0m"
            ;;
    esac
}

# ============================================================
#  八、网络诊断
# ============================================================

# 16. 网络诊断
update_sources16() {
    echo -e "\033[34m=== 网络诊断 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 查看 IP 地址       | 显示所有网卡的 IP              |"
    echo "| 002  | 查看端口监听       | 显示正在监听的 TCP/UDP 端口    |"
    echo "| 003  | 查看网络连接       | 显示当前网络连接状态          |"
    echo "| 004  | 路由追踪           | traceroute 到目标地址         |"
    echo "| 005  | DNS 查询           | dig 查询域名解析              |"
    echo "| 006  | 带宽测速           | 下载速度测试                  |"
    echo "| 007  | 快速连通性测试      | ping 指定主机                 |"
    echo "| 008  | 查看网卡状态        | ip link / ethtool            |"
    echo "| 009  | 返回               | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-009): " n_choice

    case $n_choice in
        001)
            echo -e "\033[33mIP 地址：\033[0m"
            ip -4 addr show | grep inet
            echo
            echo -e "\033[33m公网 IP：\033[0m"
            curl -s ifconfig.me
            echo
            ;;
        002)
            echo -e "\033[33mTCP 监听端口：\033[0m"
            ss -tlnp
            echo
            echo -e "\033[33mUDP 监听端口：\033[0m"
            ss -ulnp
            ;;
        003)
            echo -e "\033[33m网络连接（按状态统计）：\033[0m"
            ss -s
            echo
            echo -e "\033[33m活跃连接 Top 20：\033[0m"
            ss -tn | tail -n +2 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -20
            ;;
        004)
            read -p "请输入目标地址（如 baidu.com）: " host
            [ -z "$host" ] && return
            traceroute "$host"
            ;;
        005)
            read -p "请输入域名: " domain
            [ -z "$domain" ] && return
            dig "$domain" +short
            echo
            echo -e "\033[33m详细记录：\033[0m"
            dig "$domain"
            ;;
        006)
            echo -e "\033[33m下载速度测试（5秒）...\033[0m"
            curl -o /dev/null -s -w "速度: %{speed_download} bytes/s\n大小: %{size_download} bytes\n耗时: %{time_total}s\n" https://speed.cloudflare.com/__down?bytes=10000000
            ;;
        007)
            read -p "请输入目标地址: " host
            [ -z "$host" ] && return
            ping -c 4 "$host"
            ;;
        008)
            echo -e "\033[33m网卡列表：\033[0m"
            ip link show
            echo
            echo -e "\033[33m网卡详细信息（输入网卡名，如 eth0）: \033[0m"
            read -p "> " iface
            [ -n "$iface" ] && ip addr show "$iface" && ethtool "$iface" 2>/dev/null
            ;;
        009)
                echo "返回主菜单。"
                ;;
            *)
            echo -e "\033[31m无效的选择。\033[0m"
                 ;;
        esac
}

# ============================================================
#  九、服务管理
# ============================================================

# 17. 服务管理
update_sources17() {
    echo -e "\033[34m=== 服务管理 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 查看运行中服务     | systemctl list-units --type=service --state=running |"
    echo "| 002  | 查看所有服务       | systemctl list-unit-files --type=service         |"
    echo "| 003  | 启动服务          | systemctl start <服务名>                      |"
    echo "| 004  | 停止服务          | systemctl stop <服务名>                       |"
    echo "| 005  | 重启服务          | systemctl restart <服务名>                   |"
    echo "| 006  | 查看服务状态       | systemctl status <服务名>                    |"
    echo "| 007  | 设置开机自启       | systemctl enable <服务名>                     |"
    echo "| 008  | 取消开机自启       | systemctl disable <服务名>                    |"
    echo "| 009  | 查看服务日志       | journalctl -u <服务名> -n 20                  |"
    echo "| 010  | 返回              | 返回主菜单                                   |"
    echo
    read -p "请选择一个操作 (001-010): " s_choice

    case $s_choice in
        001)
            systemctl list-units --type=service --state=running --no-pager
            ;;
        002)
            systemctl list-unit-files --type=service --no-pager | grep -E '^.*\.service'
            ;;
        003|004|005|006|007|008)
            read -p "请输入服务名: " svc
            [ -z "$svc" ] && return
            case $s_choice in
                003) sudo systemctl start "$svc" && echo -e "\033[34m服务 $svc 已启动。\033[0m" ;;
                004) sudo systemctl stop "$svc" && echo -e "\033[34m服务 $svc 已停止。\033[0m" ;;
                005) sudo systemctl restart "$svc" && echo -e "\033[34m服务 $svc 已重启。\033[0m" ;;
                006) systemctl status "$svc" ;;
                007) sudo systemctl enable "$svc" && echo -e "\033[34m服务 $svc 已设置开机自启。\033[0m" ;;
                008) sudo systemctl disable "$svc" && echo -e "\033[34m服务 $svc 已取消开机自启。\033[0m" ;;
            esac
            ;;
        009)
            read -p "请输入服务名: " svc
            [ -z "$svc" ] && return
            journalctl -u "$svc" -n 20 --no-pager
            ;;
        010)
            echo "返回主菜单。"
            ;;
        *)
            echo -e "\033[31m无效的选择。\033[0m"
            ;;
    esac
}

# ============================================================
#  十、日志查看
# ============================================================

# 18. 日志查看
update_sources18() {
    echo -e "\033[34m=== 日志查看 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 系统全部日志       | journalctl -e（最近200条）     |"
    echo "| 002  | 内核日志           | journalctl -k                 |"
    echo "| 003  | SSH 登录日志       | 最近 SSH 登录记录             |"
    echo "| 004  | 认证失败日志       | 最近失败登录尝试              |"
    echo "| 005  | 按服务查看日志     | journalctl -u <服务名>         |"
    echo "| 006  | 查看今日日志       | journalctl --since today      |"
    echo "| 007  | 按时间范围查看     | journalctl --since/until      |"
    echo "| 008  | 系统日志文件       | /var/log 常用日志文件         |"
    echo "| 009  | 返回               | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-009): " l_choice

    case $l_choice in
        001)
            journalctl -n 200 --no-pager
            ;;
        002)
            journalctl -k --no-pager | tail -50
            ;;
        003)
            echo -e "\033[33m最近 SSH 登录成功记录：\033[0m"
            last -20 | grep sshd
            echo
            echo -e "\033[33m最近 SSH 登录记录：\033[0m"
            lastlog | tail -20
            ;;
        004)
            echo -e "\033[33m最近的认证失败记录：\033[0m"
            sudo journalctl -u ssh | grep -i "failed\|failed" | tail -30
            echo
            echo -e "\033[33m/var/log/auth.log 失败记录：\033[0m"
            sudo grep -i "failed\|failed password" /var/log/auth.log 2>/dev/null | tail -30
            ;;
        005)
            read -p "请输入服务名: " svc
            [ -z "$svc" ] && return
            journalctl -u "$svc" -n 50 --no-pager
            ;;
        006)
            journalctl --since today --no-pager | tail -100
            ;;
        007)
            read -p "请输入开始时间 (格式: YYYY-MM-DD HH:MM:SS) [默认: 1小时前]: " since
            read -p "请输入结束时间 [默认: 现在]: " until
            since=${since:-"1 hour ago"}
            until=${until:-"now"}
            journalctl --since "$since" --until "$until" --no-pager | tail -100
            ;;
        008)
            echo -e "\033[33m/var/log 目录下的日志文件：\033[0m"
            ls -lh /var/log/*.log 2>/dev/null | awk '{print $9, $5}'
            echo
            echo -e "\033[33m最近 syslog 条目：\033[0m"
            sudo tail -20 /var/log/syslog 2>/dev/null
            ;;
        009)
            echo "返回主菜单。"
            ;;
        *)
            echo -e "\033[31m无效的选择。\033[0m"
            ;;
    esac
}

# ============================================================
#  十二、Docker
# ============================================================

# 20. Docker
update_sources20() {
    install_docker() {
        if command -v docker &>/dev/null; then
            echo -e "\033[34mDocker 已安装: $(docker --version)\033[0m"
        else
            echo "正在安装 Docker..."
            curl -fsSL https://get.docker.com | sh
            sudo usermod -aG docker $USER
            echo -e "\033[34mDocker 安装完成，请重新登录后生效。\033[0m"
        fi
    }

    auto_docker() {
        echo -e "\033[34m=== Docker 管理 ===\033[0m"
        echo "| 编号 | 功能              | 说明                          |"
        echo "| :--- | :---------------- | :---------------------------- |"
        echo "| 001  | 安装 Docker        | 一键安装 Docker               |"
        echo "| 002  | 查看运行中容器      | docker ps                    |"
        echo "| 003  | 查看所有容器        | docker ps -a                 |"
        echo "| 004  | 查看镜像           | docker images                |"
        echo "| 005  | 启动容器           | docker start <容器名/ID>      |"
        echo "| 006  | 停止容器           | docker stop <容器名/ID>       |"
        echo "| 007  | 删除容器           | docker rm <容器名/ID>         |"
        echo "| 008  | 删除镜像           | docker rmi <镜像名/ID>        |"
        echo "| 009  | 查看容器日志       | docker logs <容器名>          |"
        echo "| 010  | 进入容器           | docker exec -it <容器名> bash |"
        echo "| 011  | Docker 状态       | docker system df / info       |"
        echo "| 012  | 返回              | 返回主菜单                    |"
        echo
        read -p "请选择一个操作 (001-012): " dk_choice

        case $dk_choice in
            001) install_docker ;;
            002) docker ps ;;
            003) docker ps -a ;;
            004) docker images ;;
            005)
                read -p "请输入容器名或ID: " c
                [ -n "$c" ] && docker start "$c" && echo -e "\033[34m容器 $c 已启动。\033[0m"
                ;;
            006)
                read -p "请输入容器名或ID: " c
                [ -n "$c" ] && docker stop "$c" && echo -e "\033[34m容器 $c 已停止。\033[0m"
                ;;
            007)
                read -p "请输入要删除的容器名或ID: " c
                [ -n "$c" ] && docker rm "$c" && echo -e "\033[34m容器 $c 已删除。\033[0m"
                ;;
            008)
                read -p "请输入要删除的镜像名或ID: " i
                [ -n "$i" ] && docker rmi "$i" && echo -e "\033[34m镜像 $i 已删除。\033[0m"
                ;;
            009)
                read -p "请输入容器名: " c
                read -p "查看最近多少行日志 [默认: 50]: " lines
                lines=${lines:-50}
                [ -n "$c" ] && docker logs --tail "$lines" "$c"
                ;;
            010)
                read -p "请输入容器名: " c
                [ -n "$c" ] && docker exec -it "$c" /bin/bash
                ;;
            011)
                docker system df
                echo
                docker info 2>/dev/null | head -20
                ;;
            012) echo "返回主菜单。" ;;
            *) echo -e "\033[31m无效的选择。\033[0m" ;;
        esac
    }

    auto_docker
}

# ============================================================
#  十三、SSL 证书
# ============================================================

# 21. SSL 证书
update_sources21() {
    install_certbot() {
        if command -v certbot &>/dev/null; then
            echo -e "\033[34mcertbot 已安装。\033[0m"
        else
            echo "正在安装 certbot..."
            sudo apt install -y certbot python3-certbot-nginx
        fi
    }

    echo -e "\033[34m=== SSL 证书 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 安装 certbot       | 安装 Let's Encrypt 申请工具    |"
    echo "| 002  | 申请证书（nginx）  | 为域名申请并自动配置 nginx     |"
    echo "| 003  | 申请证书（standalone）| 无 nginx 时使用独立模式申请  |"
    echo "| 004  | 查看证书列表       | 显示已有证书及到期时间         |"
    echo "| 005  | 续期证书           | 手动续期指定证书              |"
    echo "| 006  | 删除证书           | 吊销并删除指定证书            |"
    echo "| 007  | 自动续期设置       | 配置 certbot 自动续期 cron     |"
    echo "| 008  | 返回              | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-008): " cb_choice

    case $cb_choice in
        001) install_certbot ;;
        002)
            read -p "请输入域名（如 example.com）: " domain
            read -p "请输入域名对应的 webroot [默认: /var/www/html]: " webroot
            webroot=${webroot:-/var/www/html}
            [ -n "$domain" ] && sudo certbot --nginx -d "$domain" --webroot -w "$webroot"
            ;;
        003)
            read -p "请输入域名: " domain
            [ -n "$domain" ] && sudo certbot certonly --standalone -d "$domain"
            ;;
        004)
            echo -e "\033[33m已有证书：\033[0m"
            sudo certbot certificates 2>/dev/null || echo "未找到证书。"
            echo
            echo -e "\033[33m/etc/letsencrypt/live/ 下的证书：\033[0m"
            sudo ls -la /etc/letsencrypt/live/ 2>/dev/null
            ;;
        005)
            read -p "请输入要续期的域名: " domain
            [ -n "$domain" ] && sudo certbot renew --cert-name "$domain" --force-renewal
            ;;
        006)
            read -p "请输入要删除的域名: " domain
            [ -n "$domain" ] && sudo certbot delete --cert-name "$domain"
            ;;
        007)
            (sudo crontab -l 2>/dev/null | grep -v certbot; echo "0 0 * * * certbot renew --quiet") | sudo crontab -
            echo -e "\033[34m已设置每天 0:00 自动续期。\033[0m"
            ;;
        008) echo "返回主菜单。" ;;
        *) echo -e "\033[31m无效的选择。\033[0m" ;;
    esac
}

# ============================================================
#  十四、备份工具
# ============================================================

# 22. rsync 备份
update_sources22() {
    echo -e "\033[34m=== 备份工具 (rsync) ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 同步本地目录        | rsync 本地目录同步            |"
    echo "| 002  | 推送到远程服务器    | rsync 本地 -> 远程           |"
    echo "| 003  | 从远程拉取         | rsync 远程 -> 本地           |"
    echo "| 004  | 查看 rsync 帮助     | rsync 常用参数说明           |"
    echo "| 005  | 返回              | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-005): " rs_choice

    case $rs_choice in
        001)
            read -p "请输入源目录: " src
            read -p "请输入目标目录: " dst
            [ -z "$src" -o -z "$dst" ] && echo "源目录和目标目录不能为空。" && return
            echo -e "\033[33m即将执行: rsync -avz ${src} ${dst}\033[0m"
            read -p "确认执行？(y/n): " c
            [ "$c" == "y" ] && rsync -avz "$src" "$dst" && echo -e "\033[34m同步完成。\033[0m"
            ;;
        002)
            read -p "请输入源目录: " src
            read -p "请输入远程用户@IP:port（如 ubuntu@1.2.3.4）: " remote
            read -p "请输入远程目标路径: " rdpath
            [ -z "$src" -o -z "$remote" -o -z "$rdpath" ] && return
            echo -e "\033[33m即将执行: rsync -avz ${src} ${remote}:${rdpath}\033[0m"
            read -p "确认执行？(y/n): " c
            [ "$c" == "y" ] && rsync -avz "$src" "$remote":"$rdpath" && echo -e "\033[34m推送完成。\033[0m"
            ;;
        003)
            read -p "请输入远程用户@IP:port: " remote
            read -p "请输入远程源路径: " rsrc
            read -p "请输入本地目标目录: " dst
            [ -z "$remote" -o -z "$rsrc" -o -z "$dst" ] && return
            echo -e "\033[33m即将执行: rsync -avz ${remote}:${rsrc} ${dst}\033[0m"
            read -p "确认执行？(y/n): " c
            [ "$c" == "y" ] && rsync -avz "$remote":"$rsrc" "$dst" && echo -e "\033[34m拉取完成。\033[0m"
            ;;
        004)
            rsync --help | head -30
            ;;
        005) echo "返回主菜单。" ;;
        *) echo -e "\033[31m无效的选择。\033[0m" ;;
    esac
}

# ============================================================
#  十五、Swap 管理
# ============================================================

# 23. Swap 管理
update_sources23() {
    show_swap() {
        echo -e "\033[33m当前 Swap 状态：\033[0m"
        swapon --show
        echo
        free -h | grep -E "Swap|Mem"
    }

    echo -e "\033[34m=== Swap 管理 ===\033[0m"
    show_swap
    echo
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 添加 Swap 文件     | 创建指定大小的 Swap 文件      |"
    echo "| 002  | 删除 Swap 文件     | 移除 Swap 并关闭              |"
    echo "| 003  | 调整 Swappiness    | 修改系统交换倾向（0-100）     |"
    echo "| 004  | 刷新显示           | 重新查看 Swap 状态            |"
    echo "| 005  | 返回              | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-005): " sw_choice

    case $sw_choice in
        001)
            read -p "请输入 Swap 大小（如 2G, 1024M）: " size
            [ -z "$size" ] && echo "大小不能为空。" && return
            read -p "请输入 Swap 文件路径 [默认: /swapfile]: " path
            path=${path:-/swapfile}
            echo -e "\033[33m正在创建 ${size} 的 Swap 文件...\033[0m"
            sudo fallocate -l "$size" "$path" || sudo dd if=/dev/zero of="$path" bs=1M count=$(echo "$size" | sed 's/[GMgm]//')
            sudo chmod 600 "$path"
            sudo mkswap "$path"
            sudo swapon "$path"
            echo "$path none swap sw 0 0" | sudo tee -a /etc/fstab
            echo -e "\033[34mSwap 文件已创建并启用。\033[0m"
            show_swap
            ;;
        002)
            read -p "请输入 Swap 文件路径 [默认: /swapfile]: " path
            path=${path:-/swapfile}
            echo -e "\033[33m正在关闭并删除 Swap...\033[0m"
            sudo swapoff "$path" && sudo rm -f "$path"
            sudo sed -i "\|$path|d" /etc/fstab
            echo -e "\033[34mSwap 已删除。\033[0m"
            show_swap
            ;;
        003)
            read -p "请输入 Swappiness 值（0-100）[默认: 60]: " val
            val=${val:-60}
            [ "$val" -ge 0 -a "$val" -le 100 ] 2>/dev/null || { echo "请输入 0-100 的数字。"; return; }
            sudo sysctl vm.swappiness="$val"
            echo "vm.swappiness=$val" | sudo tee -a /etc/sysctl.conf
            echo -e "\033[34mSwappiness 已设置为 $val。\033[0m"
            ;;
        004) show_swap ;;
        005) echo "返回主菜单。" ;;
        *) echo -e "\033[31m无效的选择。\033[0m" ;;
    esac
}

# ============================================================
#  十六、定时任务
# ============================================================

# 24. 定时任务
update_sources24() {
    echo -e "\033[34m=== 定时任务 (crontab) ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 查看当前用户 crontab | 列出当前用户所有定时任务      |"
    echo "| 002  | 查看系统 crontab   | /etc/crontab 及 /etc/cron.d/  |"
    echo "| 003  | 查看每日任务        | /etc/cron.daily/             |"
    echo "| 004  | 添加定时任务        | 交互式添加新任务              |"
    echo "| 005  | 删除定时任务        | 编辑 crontab 删除指定任务     |"
    echo "| 006  | 查看任务执行日志    | crontab 执行日志              |"
    echo "| 007  | 返回              | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-007): " cron_choice

    case $cron_choice in
        001)
            echo -e "\033[33m当前用户 crontab：\033[0m"
            crontab -l 2>/dev/null || echo "当前用户没有定时任务。"
            ;;
        002)
            echo -e "\033[33m/etc/crontab：\033[0m"
            cat /etc/crontab 2>/dev/null
            echo
            echo -e "\033[33m/etc/cron.d/：\033[0m"
            sudo ls /etc/cron.d/ 2>/dev/null
            ;;
        003)
            echo -e "\033[33m/etc/cron.daily/：\033[0m"
            sudo ls -la /etc/cron.daily/ 2>/dev/null
            ;;
        004)
            read -p "请输入 cron 表达式（如 0 2 * * * 表示每天凌晨2点）: " cron_expr
            read -p "请输入要执行的命令: " cmd
            [ -z "$cron_expr" -o -z "$cmd" ] && echo "表达式和命令不能为空。" && return
            (crontab -l 2>/dev/null; echo "$cron_expr $cmd") | crontab -
            echo -e "\033[34m定时任务已添加。\033[0m"
            crontab -l
            ;;
        005)
            echo -e "\033[33m当前 crontab（将打开编辑器删除对应行）:\033[0m"
            crontab -l 2>/dev/null
            echo
            read -p "请输入要删除的命令关键字（部分匹配即可）: " keyword
            [ -z "$keyword" ] && return
            crontab -l 2>/dev/null | grep -v "$keyword" | crontab -
            echo -e "\033[34m已删除包含 '$keyword' 的任务。\033[0m"
            ;;
        006)
            grep -i cron /var/log/syslog 2>/dev/null | tail -30 || echo "日志文件不可用。"
            ;;
        007) echo "返回主菜单。" ;;
        *) echo -e "\033[31m无效的选择。\033[0m" ;;
    esac
}

# ============================================================
#  十七、SSH 安全
# ============================================================

# 25. SSH 安全
update_sources25() {
    echo -e "\033[34m=== SSH 安全 ===\033[0m"
    echo "| 编号 | 功能              | 说明                          |"
    echo "| :--- | :---------------- | :---------------------------- |"
    echo "| 001  | 查看 SSH 配置      | 显示 sshd_config 关键配置     |"
    echo "| 002  | 安装 fail2ban     | 防止暴力破解 SSH              |"
    echo "| 003  | 配置 fail2ban     | 配置 SSH 防暴力破解规则       |"
    echo "| 004  | 查看 fail2ban 状态 | 查看封禁 IP 列表              |"
    echo "| 005  | 禁止密码登录       | 改为仅密钥登录（需确认有密钥！）|"
    echo "| 006  | 禁止 root 登录     | 禁止 root 直接 SSH 登录       |"
    echo "| 007  | 修改 SSH 端口      | 修改默认 22 端口               |"
    echo "| 008  | 返回              | 返回主菜单                    |"
    echo
    read -p "请选择一个操作 (001-008): " ssh_choice

    case $ssh_choice in
        001)
            echo -e "\033[33mSSH 关键配置：\033[0m"
            grep -E "^(Port|PermitRootLogin|PasswordAuthentication|PubkeyAuthentication|PermitEmptyPasswords|Protocol)" /etc/ssh/sshd_config
            ;;
        002)
            if command -v fail2ban-client &>/dev/null; then
                echo -e "\033[34mfail2ban 已安装。\033[0m"
            else
                echo "正在安装 fail2ban..."
                sudo apt install -y fail2ban
                sudo systemctl enable fail2ban
                sudo systemctl start fail2ban
                echo -e "\033[34mfail2ban 安装完成。\033[0m"
            fi
            ;;
        003)
            read -p "请输入 SSH 端口 [默认: 22]: " port
            port=${port:-22}
            cat << EOF | sudo tee /etc/fail2ban/jail.local > /dev/null
[sshd]
enabled = true
port = $port
filter = sshd
logpath = /var/log/auth.log
maxretry = 5
bantime = 3600
findtime = 600
EOF
            sudo systemctl restart fail2ban
            echo -e "\033[34mfail2ban SSH 防暴力破解规则已配置。\033[0m"
            ;;
        004)
            if command -v fail2ban-client &>/dev/null; then
                echo -e "\033[33mfail2ban 状态：\033[0m"
                sudo fail2ban-client status
                echo
                echo -e "\033[33m当前被封禁的 IP：\033[0m"
                sudo fail2ban-client status sshd | grep -A 20 "Banned"
            else
                echo -e "\033[31mfail2ban 未安装，请先选择 002 安装。\033[0m"
            fi
            ;;
        005)
            echo -e "\033[31m警告：此操作禁止密码登录，请确保已配置 SSH 密钥！\033[0m"
            read -p "确认禁止密码登录？(y/n): " c
            [ "$c" != "y" ] && return
            sudo sed -i 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
            sudo sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
            sudo systemctl restart sshd
            echo -e "\033[34m已禁止密码登录，请确保密钥已配置。\033[0m"
            ;;
        006)
            echo -e "\033[31m警告：禁止 root 登录后请确保有其他 sudo 用户！\033[0m"
            read -p "确认禁止 root 登录？(y/n): " c
            [ "$c" != "y" ] && return
            sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
            sudo systemctl restart sshd
            echo -e "\033[34m已禁止 root SSH 登录。\033[0m"
            ;;
        007)
            read -p "请输入新的 SSH 端口: " newport
            [ -z "$newport" ] && return
            echo -e "\033[33m正在修改 SSH 端口为 $newport...\033[0m"
            sudo sed -i "s/^#Port 22/Port $newport/" /etc/ssh/sshd_config
            sudo sed -i "s/^Port 22/Port $newport/" /etc/ssh/sshd_config
            sudo ufw allow "$newport"/tcp 2>/dev/null
            sudo systemctl restart sshd
            echo -e "\033[34mSSH 端口已改为 $newport，记得更新防火墙规则！\033[0m"
            ;;
        008) echo "返回主菜单。" ;;
        *) echo -e "\033[31m无效的选择。\033[0m" ;;
    esac
}

# ============================================================
#  十八、卸载
# ============================================================

# 19. 卸载
update_sources19() {
    echo "| 编号 | 功能     | 说明           |"
    echo "| :--- | :------- | :------------- |"
    echo "| 191  | xrdp远程桌面 | 卸载xrdp及相关组件 |"
    echo "| 193  | 返回      | 返回主菜单       |"
    echo
    read -p "请选择一个操作 (191/193): " sub_choice

    case $sub_choice in
        191)
            auto_confirm() {
                echo "y" | sudo $@
            }

            auto_confirm service xrdp stop
            auto_confirm apt remove xrdp
            auto_confirm apt purge xrdp
            auto_confirm apt autoremove

            auto_confirm rm -rf /etc/xrdp
            auto_confirm rm -rf /etc/xrdpstart
            auto_confirm rm -rf /etc/xrdp-sesman
            auto_confirm rm -rf /usr/share/doc/xrdp
            auto_confirm rm -rf /var/log/xrdp.log
            auto_confirm rm -rf /var/run/xrdp
            auto_confirm rm -rf /usr/local/sbin/xrdp
            auto_confirm rm -rf /usr/local/sbin/xrdp-sesman

            auto_confirm apt-get remove xubuntu*
            auto_confirm apt autoremove

            echo -e "\033[34m所有xrdp及其相关组件，已成功移除。\033[0m"
            ;;
        193)
            echo "返回主菜单。"
            ;;
        *)
            echo -e "\033[31m无效的选择，请输入 191 或 193。\033[0m"
        ;;
esac
}

# ============================================================
#  主菜单
# ============================================================

main_menu() {
    clear
    echo " 高山仰止,景行行止.虽不能至,心向往之。"
    echo " .--,       .--, "
    echo "( (  \.---./  ) ) "
    echo " '.__/o   o\__.'  "
    echo "    {=  ^  =}  "
    echo "     >  -  <  "
    echo "    /       \ "
    echo "   //       \\ "
    echo " //|   .   |\\ "
    echo "    \       / "
    echo "     \  _  /   "
    echo "   (___)( )(___ )    "
    echo "  (((__) (__))) "

    echo -e "\033[34m-----------欢迎使用常见脚本！----------\033[0m"
    echo -e "\033[33m*适用于ubuntu 22.04/24.04版本*\033[0m"
    echo

    echo -e "\033[35m一、系统基础配置\033[0m"
    echo "| 编号 | 功能             | 说明                           |"
    echo "| :--- | :--------------- | :----------------------------- |"
    echo "| 101  | 更改阿里云软件源  | 替换apt源为阿里镜像+上海时区     |"
    echo "| 102  | 更新升级软件包    | apt update && apt upgrade      |"
    echo "| 103  | 中文语言包        | 安装中文语言包并设置系统语言为中文 |"
    echo "| 104  | xrdp远程桌面      | 安装xrdp+Xubuntu桌面，端口3389  |"
    echo "| 105  | 查看ubuntu版本    | 显示内核/架构/OS/用户/主机名/时间 |"
    echo "| 106  | 添加root账户      | 启用root登录并设置密码           |"
    echo "| 107  | 修改目录所有者     | 交互式修改目录owner和group      |"
    echo "| 108  | 上传脚本到服务器   | 显示scp上传命令示例             |"
    echo
    echo -e "\033[35m二、网络配置\033[0m"
    echo "| 编号 | 功能             | 说明                              |"
    echo "| :--- | :--------------- | :-------------------------------  |"
    echo "| 109  | 网络配置(netplan) | 查看/配置静态IP或DHCP自动获取     |"
    echo
    echo -e "\033[35m三、系统工具\033[0m"
    echo "| 编号 | 功能             | 说明                              |"
    echo "| :--- | :--------------- | :-------------------------------  |"
    echo "| 110  | 系统监控         | CPU/内存/磁盘/进程监控            |"
    echo "| 111  | 防火墙 ufw      | 开/关/放行端口/禁止端口/查看规则    |"
    echo "| 112  | 用户管理         | 添加/删除/密码/sudo权限           |"
    echo "| 113  | 磁盘管理         | 磁盘使用/大文件/目录大小/IO       |"
    echo "| 114  | 网络诊断         | 端口/连接/路由/DNS/测速           |"
    echo "| 115  | 服务管理         | systemctl启停/状态/自启/日志      |"
    echo "| 116  | 日志查看         | journalctl/SSH日志/认证失败日志   |"
    echo "| 117  | Docker          | 容器/镜像管理/日志/进入容器        |"
    echo "| 118  | SSL证书         | Let's Encrypt申请/续期/自动续期    |"
    echo "| 119  | rsync备份       | 本地同步/推送到远程/从远程拉取     |"
    echo "| 120  | Swap管理         | 添加/删除Swap/调整Swappiness     |"
    echo "| 121  | 定时任务         | crontab增删改/查看系统定时任务     |"
    echo "| 122  | SSH安全          | fail2ban/禁止密码登录/禁止root登录 |"
    echo "| 703  | 修复依赖错误      | 安装aptitude修复依赖               |"
    echo "| 704  | NPS穿透内网客户端  | 一键安装NPC内网穿透客户端           |"
    echo "| 705  | 清理系统垃圾      | 清理日志/缓存/旧snap释放磁盘空间   |"
    echo
    echo -e "\033[35m四、卸载\033[0m"
    echo "| 编号 | 功能             | 说明                              |"
    echo "| :--- | :--------------- | :-------------------------------  |"
    echo "| 191  | 卸载xrdp远程桌面  | 卸载xrdp及Xubuntu桌面环境         |"
    echo "| 000  | 退出              | 退出脚本                          |"
    echo
    echo -ne "\033[36m> 请输入编号操作: \033[0m"
}

# ============================================================
#  主循环
# ============================================================

while true; do
    main_menu
    read choice

    case $choice in
        101) update_sources1 ;;
        102) update_sources2 ;;
        103) update_sources3 ;;
        104) update_sources4 ;;
        105) update_sources5 ;;
        106) update_sources6 ;;
        107) update_sources107 ;;
        108) update_sources108 ;;
        109) update_sources10 ;;
        110) update_sources12 ;;
        111) update_sources13 ;;
        112) update_sources14 ;;
        113) update_sources15 ;;
        114) update_sources16 ;;
        115) update_sources17 ;;
        116) update_sources18 ;;
        117) update_sources20 ;;
        118) update_sources21 ;;
        119) update_sources22 ;;
        120) update_sources23 ;;
        121) update_sources24 ;;
        122) update_sources25 ;;
        703) update_sources8 ;;
        704) update_sources9 ;;
        705) update_sources11 ;;
        191) update_sources19 ;;
        000) echo "退出脚本。"; exit 0 ;;
        *) echo -e "\033[31m无效的编号，请重新输入。\033[0m"; sleep 0.3 ;;
    esac

    echo
    read -p "按回车键返回主菜单..." _
done
