建议-希望优化在线部署脚本

说明(发布前可手动删除说明内容):

  • 发布话题前请确认好标题与标签、你已经看过了[JumpServer版规V1.0] ;
  • 如有必要请附带以下信息:JumpServer 版本、运行方式(安装包运行 or 源码运行 )、浏览器版本、更多描述或截图信息。
    参考文档(https://docs.jumpserver.org/zh/v4/quick_start/)可知,当前在线部署脚本检测到无iptables时会提示需安装iptables。是否可以考虑在脚本里增加两个功能
  1. 判断当前环境的操作系统发行版。

  1. 根据发行版自动安装iptables。例如判断是ubuntu时,执行命令(apt update -y && apt install iptables -y

我的思考如下
当检测到iptables未安装时,触发以下流程

  1. 检测当前操作系统网络和dns解析是否正常。若异常,提示联网异常或dns无法解析域名。
  2. 若网络检测正常,判断当前操作系统发行版
  3. 根据操作系统发行版,执行专属的命令安装iptables。安装之前先更新软件包缓存,例如ubuntu需执行sudo apt update -y
  4. 检测安装结果,确认安装成功。
    我对脚本代码的思考如下,
#!/bin/bash
set -euo pipefail

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 无颜色

# 预检测:检查iptables是否已安装
echo -e "${YELLOW}正在检查iptables是否已安装...${NC}"
if command -v iptables > /dev/null 2>&1; then
    version=$(iptables --version | awk '{print $2}')
    echo -e "${GREEN}iptables已安装,当前版本: $version${NC}"
    echo -e "${GREEN}无需进行后续安装操作${NC}"
    exit 0
fi

echo -e "${YELLOW}未检测到iptables,将执行安装流程${NC}"

# 1. 网络和DNS检测
echo -e "\n${YELLOW}正在检测网络连接...${NC}"

# 检测基础网络连通性(IP层)
ip_test="8.8.8.8"
if ! ping -c 2 $ip_test > /dev/null 2>&1; then
    echo -e "${RED}错误:网络连接异常,无法访问IP地址 $ip_test${NC}"
    echo -e "${RED}请检查网络接口配置、网关设置或物理连接${NC}"
    exit 1
fi

echo -e "${GREEN}基础网络连接正常${NC}"
echo -e "${YELLOW}正在检测DNS解析功能...${NC}"

# 检测DNS解析,使用多个域名测试
domain1="baidu.com"
domain2="google.com"
dns_success=0

# 测试第一个域名
if ping -c 1 $domain1 > /dev/null 2>&1; then
    echo -e "${GREEN}DNS解析成功:$domain1 可正常解析和访问${NC}"
    dns_success=1
else
    echo -e "${YELLOW}警告:$domain1 解析或访问失败,尝试下一个域名...${NC}"
fi

# 测试第二个域名,如果第一个已成功则跳过
if [ $dns_success -eq 0 ]; then
    if ping -c 1 $domain2 > /dev/null 2>&1; then
        echo -e "${GREEN}DNS解析成功:$domain2 可正常解析和访问${NC}"
        dns_success=1
    else
        echo -e "${RED}错误:DNS解析失败,$domain1 和 $domain2 均无法解析或访问${NC}"
        echo -e "${RED}请检查DNS服务器配置或 hosts 文件${NC}"
        exit 1
    fi
fi

echo -e "${GREEN}网络和DNS检测均正常${NC}"

# 2. 检测操作系统发行版
echo -e "\n${YELLOW}正在识别操作系统发行版...${NC}"

distro=""
package_manager=""

if [ -f /etc/os-release ]; then
    . /etc/os-release
    distro=$ID
else
    # 兼容较老的系统
    if [ -f /etc/redhat-release ]; then
        distro="rhel"
    elif [ -f /etc/debian_version ]; then
        distro="debian"
    elif [ -f /etc/SuSE-release ]; then
        distro="suse"
    else
        echo -e "${RED}错误:无法识别操作系统发行版${NC}"
        exit 1
    fi
fi

# 确定包管理器和安装命令
case $distro in
    ubuntu|debian|mint)
        package_manager="apt"
        update_cmd="sudo apt update -y"
        install_cmd="sudo apt install -y iptables"
        ;;
    centos|rhel|fedora|rocky|almalinux)
        # 检测是否使用dnf还是yum
        if command -v dnf > /dev/null 2>&1; then
            package_manager="dnf"
        else
            package_manager="yum"
        fi
        update_cmd="sudo $package_manager check-update -y || true"
        install_cmd="sudo $package_manager install -y iptables"
        ;;
    suse|opensuse)
        package_manager="zypper"
        update_cmd="sudo zypper refresh"
        install_cmd="sudo zypper install -y iptables"
        ;;
    *)
        echo -e "${RED}错误:不支持的操作系统发行版: $distro${NC}"
        exit 1
        ;;
esac

echo -e "${GREEN}检测到操作系统发行版: $distro,使用包管理器: $package_manager${NC}"

# 3. 安装iptables
echo -e "\n${YELLOW}正在更新软件包缓存...${NC}"
if ! eval $update_cmd; then
    echo -e "${RED}错误:更新软件包缓存失败${NC}"
    exit 1
fi

echo -e "\n${YELLOW}正在安装iptables...${NC}"
if ! eval $install_cmd; then
    echo -e "${RED}错误:iptables安装失败${NC}"
    exit 1
fi

# 4. 验证安装结果
echo -e "\n${YELLOW}正在验证iptables安装结果...${NC}"
if command -v iptables > /dev/null 2>&1; then
    version=$(iptables --version | awk '{print $2}')
    echo -e "${GREEN}iptables安装成功,版本: $version${NC}"
else
    echo -e "${RED}错误:iptables安装失败,未找到iptables命令${NC}"
    exit 1
fi

echo -e "\n${GREEN}所有操作完成${NC}"
exit 0