From 32ce648f6c476740a75ad900838ce1f9900a33ea Mon Sep 17 00:00:00 2001 From: hotyue <52734432+hotyue@users.noreply.github.com> Date: Wed, 3 Jun 2026 01:25:09 +0000 Subject: [PATCH] =?UTF-8?q?feat(arch):=20=E8=A1=A5=E5=85=85=E5=9F=BA?= =?UTF-8?q?=E7=A1=80=E8=AE=BE=E6=96=BD=E6=A8=A1=E5=9D=97=20(env=5Fsetup.sh?= =?UTF-8?q?)=EF=BC=8C=E5=AE=8C=E6=88=90=20Agent=20=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E6=B5=81=E5=85=A8=E7=BB=84=E4=BB=B6=E8=A7=A3=E8=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install/env_setup.sh | 139 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100755 install/env_setup.sh diff --git a/install/env_setup.sh b/install/env_setup.sh new file mode 100755 index 0000000..f6f8eae --- /dev/null +++ b/install/env_setup.sh @@ -0,0 +1,139 @@ +#!/bin/bash +# ========================================================== +# 模块名称: env_setup.sh +# 核心功能: 靶机架构预检、云端版本解析、多分支包管理器依赖补全 +# ========================================================== + +is_systemd() { + command -v systemctl >/dev/null 2>&1 || return 1 + [ -d /run/systemd/system ] || return 1 + return 0 +} + +get_os_info() { + if [ -f /etc/os-release ]; then + . /etc/os-release + echo "$PRETTY_NAME" + else + uname -srm + fi +} + +get_virt_info() { + if grep -qaE 'docker|containerd|podman' /proc/1/cgroup 2>/dev/null || [ -f /.dockerenv ]; then + echo "Docker/OCI Container" + elif grep -qa container=lxc /proc/1/environ 2>/dev/null || [ -d /proc/vz ]; then + echo "LXC/OpenVZ" + elif command -v systemd-detect-virt >/dev/null 2>&1; then + systemd-detect-virt + else + echo "Unknown/Bare Metal" + fi +} + +version_lt() { + test "$(printf '%s\n' "$1" "$2" | sort -V | head -n 1)" = "$1" && test "$1" != "$2" +} + +# ---------------------------------------------------------- +# [时序 1] 预检系统环境,输出雷达面板 +# ---------------------------------------------------------- +do_env_precheck() { + echo -e "\n======================================" + echo -e "📊 \033[36mIP-Sentinel 靶机环境侦测预检\033[0m" + echo -e "--------------------------------------" + echo -e "OS 架构 : $(get_os_info)" + echo -e "虚拟化 : $(get_virt_info)" + if is_systemd; then + echo -e "Init 系统 : systemd ✅" + else + echo -e "Init 系统 : 非 systemd ⚠️ (将自动降维至守护循环)" + fi + echo -e "======================================\n" + sleep 1 + + INSTALL_DIR="/opt/ip_sentinel" + CONFIG_FILE="${INSTALL_DIR}/config.conf" +} + +# ---------------------------------------------------------- +# [时序 2] 解析远端版本锚点 +# ---------------------------------------------------------- +do_fetch_version() { + # 动态抓取,若失败则提供硬编码保底 + TARGET_VERSION=$( (curl -fsSL --connect-timeout 5 --retry 2 "${REPO_RAW_URL}/version.txt" || curl -4 -fsSL --connect-timeout 5 --retry 2 "${REPO_RAW_URL}/version.txt") 2>/dev/null | grep "^AGENT_VERSION=" | cut -d'=' -f2 | tr -d '[:space:]') + TARGET_VERSION=${TARGET_VERSION:-"4.2.3"} +} + +# ---------------------------------------------------------- +# [时序 3] 唤醒包管理器,补全战地依赖 +# ---------------------------------------------------------- +do_install_deps() { + echo -e "\n[1/7] 正在探测并安装基础环境依赖 (curl, jq, cron, procps, python3)..." + REQUIRED_CMDS=("curl" "jq" "crontab" "pgrep" "python3" "openssl") + MISSING_CMDS=() + + for cmd in "${REQUIRED_CMDS[@]}"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + MISSING_CMDS+=("$cmd") + fi + done + + if [ ${#MISSING_CMDS[@]} -gt 0 ]; then + echo "⏳ 发现缺失依赖: ${MISSING_CMDS[*]},正在尝试自动补齐..." + + if command -v apt-get >/dev/null 2>&1; then + apt-get update -y >/dev/null 2>&1 + apt-get install -y --no-install-recommends curl jq cron procps python3 openssl >/dev/null 2>&1 + systemctl enable cron >/dev/null 2>&1 && systemctl start cron >/dev/null 2>&1 + + elif command -v yum >/dev/null 2>&1 || command -v dnf >/dev/null 2>&1 || command -v microdnf >/dev/null 2>&1; then + PKG_MGR="yum" + OPT_ARGS="" + if command -v dnf >/dev/null 2>&1; then + PKG_MGR="dnf" + OPT_ARGS="--setopt=install_weak_deps=False" + elif command -v microdnf >/dev/null 2>&1; then + PKG_MGR="microdnf" + fi + + echo -e "\033[90m (正在安装 epel-release 扩展源,请稍候...)\033[0m" + $PKG_MGR install -y epel-release >/dev/null 2>&1 || true + + echo -e "\033[90m (正在拉取核心组件...)\033[0m" + $PKG_MGR install -y $OPT_ARGS curl jq cronie procps-ng python3 openssl + systemctl enable crond >/dev/null 2>&1 && systemctl start crond >/dev/null 2>&1 + + elif command -v apk >/dev/null 2>&1; then + echo "Alpine 探测到系统类型为 Alpine Linux,正在执行轻量级安装..." + apk add --no-cache curl jq cronie procps python3 bash openssl || apk add --no-cache curl jq procps python3 bash openssl + mkdir -p /var/spool/cron/crontabs + rc-update add crond default >/dev/null 2>&1 + service crond start >/dev/null 2>&1 + + elif command -v pacman >/dev/null 2>&1; then + pacman -S --needed --noconfirm curl jq cronie procps-ng python openssl >/dev/null 2>&1 + mkdir -p /root/.cache/crontab 2>/dev/null + systemctl enable cronie >/dev/null 2>&1 && systemctl start cronie >/dev/null 2>&1 + + else + echo -e "\033[31m❌ 自动安装失败:系统未知的包管理器。\033[0m" + echo -e "\033[33m⚠️ 请根据您的操作系统,手动执行以下安装命令后重新运行本脚本:\033[0m" + echo -e " Debian/Ubuntu: \033[36mapt-get update && apt-get install -y --no-install-recommends curl jq cron procps python3 openssl\033[0m" + echo -e " CentOS/RHEL: \033[36myum install -y curl jq cronie procps-ng python3 openssl\033[0m" + echo -e " Alpine Linux: \033[36mapk add --no-cache curl jq cronie procps python3 bash openssl\033[0m" + echo -e " Arch Linux: \033[36mpacman -Syu --needed curl jq cronie procps-ng python openssl\033[0m" + exit 1 + fi + + for cmd in "${REQUIRED_CMDS[@]}"; do + if ! command -v "$cmd" >/dev/null 2>&1; then + echo -e "\033[31m❌ 致命错误:核心命令 '$cmd' 仍未找到!\033[0m" + echo -e "这通常是因为您的系统源配置错误或缺失基础组件库导致。" + echo -e "请手动修复您的包管理器源,或联系 VPS 供应商重新格式化系统。" + exit 1 + fi + done + fi + echo -e "\033[32m✅ 基础环境检测通过。\033[0m" +}