From 0ccf7193cd91bc5bed7d90217381beaa81424e38 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Mon, 19 Jan 2026 20:44:46 +0800 Subject: [PATCH 01/33] Update README.md --- README.md | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 69b698b..b2669a9 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,10 @@

本项目主要解决以下问题: - -- ❌ 官方 Clash 二进制下载、架构区分、配置部署繁琐 -- ❌ 手动管理 Clash 进程、端口、环境变量不稳定 -- ❌ systemd 服务、权限、安全配置缺乏统一方案 -- ❌ 多订阅 / 配置混乱,升级和回滚成本高 +- ✕ 官方 Clash 二进制下载、架构区分、配置部署繁琐 +- ✕ 手动管理 Clash 进程、端口、环境变量不稳定 +- ✕ systemd 服务、权限、安全配置缺乏统一方案 +- ✕ 多订阅 / 配置混乱,升级和回滚成本高 ### 核心特性 @@ -28,7 +27,7 @@ - 自动生成或自定义 Secret - 默认开启 TLS 校验 - 🧪 **端口自动检测与分配**,避免冲突 -- 🔄 **多订阅管理(clashctl)**,支持订阅切换、更新、日志查看 +- 🔄 **多订阅管理(clashctl)**,支持自动订阅切换(Vmess / V2Ray、Shadowsocks (SS)、ShadowsocksR (SSR)、Trojan、VLESS、Hysteria / Hysteria2、TUIC、HTTP / SOCKS5) - 🧠 **Mixin 机制**,可按需追加/覆盖 Clash 配置 - 🌐 **Tun 模式支持**(需 Clash Meta / Premium) @@ -46,13 +45,6 @@ - ❌ 不适合只想“点点 UI 就用”的纯桌面用户 - ❌ 不包含任何节点、机场或订阅推荐 -### 更新状态 - -📅 **持续维护中** - 最近更新:**2026-01-15** - - - # 安装 > **推荐路径优先,一键安装即可满足 90% 使用场景。** From 48d2d90ee55dafca0bff8003bb38b53f70c13740 Mon Sep 17 00:00:00 2001 From: wnlen <62139570+wnlen@users.noreply.github.com> Date: Tue, 20 Jan 2026 08:03:47 +0800 Subject: [PATCH 02/33] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index b2669a9..17b5af3 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -[TOC] - # 关于本项目 **clash-for-linux** 是一个面向 Linux 服务器/桌面环境的 **Clash 自动化运行与管理脚本集**。 @@ -341,4 +339,4 @@ sudo chmod +x /etc/rc.local 3. 程序日志中出现`error: unsupported rule type RULE-SET`报错,解决方法查看官方[WIKI](https://github.com/Dreamacro/clash/wiki/FAQ#error-unsupported-rule-type-rule-set) ## ⭐ Star History -[![Star History Chart](https://api.star-history.com/svg?repos=wnlen/clash-for-linux&type=Date)](https://star-history.com/#wnlen/clash-for-linux&Date) \ No newline at end of file +[![Star History Chart](https://api.star-history.com/svg?repos=wnlen/clash-for-linux&type=Date)](https://star-history.com/#wnlen/clash-for-linux&Date) From 87397bb62ee52630b335863004e66c3f81f59499 Mon Sep 17 00:00:00 2001 From: Taoyu Yang Date: Sat, 14 Feb 2026 08:35:35 +0000 Subject: [PATCH 03/33] Support docker containers --- clashctl | 9 ++++--- install.sh | 75 ++++++++++++++++++++++++++++++++++++++---------------- start.sh | 5 ++++ 3 files changed, 64 insertions(+), 25 deletions(-) diff --git a/clashctl b/clashctl index 4d26e2e..e7f02ea 100755 --- a/clashctl +++ b/clashctl @@ -35,7 +35,9 @@ PID_FILE="$CLASH_HOME/temp/clash.pid" SUBSCRIPTION_FILE="$CLASH_HOME/conf/subscriptions.list" use_systemd() { - command -v systemctl >/dev/null 2>&1 + command -v systemctl >/dev/null 2>&1 || return 1 + systemctl show --property=Version --value >/dev/null 2>&1 || return 1 + return 0 } action_with_systemd() { @@ -78,10 +80,11 @@ set_env_var() { echo "[ERROR] 未找到 .env 文件: $ENV_FILE" >&2 exit 1 fi - local escaped + local escaped escaped_sed escaped=$(printf "%s" "$value" | sed "s/'/'\"'\"'/g") + escaped_sed=$(printf "%s" "$escaped" | sed 's/[\\&@]/\\&/g') if grep -q "^export ${key}=" "$ENV_FILE"; then - sed -i "s@^export ${key}=.*@export ${key}='${escaped}'@" "$ENV_FILE" + sed -i "s@^export ${key}=.*@export ${key}='${escaped_sed}'@" "$ENV_FILE" else echo "export ${key}='${escaped}'" >> "$ENV_FILE" fi diff --git a/install.sh b/install.sh index f397e45..3b7aef9 100755 --- a/install.sh +++ b/install.sh @@ -351,35 +351,57 @@ read_secret_from_config() { printf '%s' "$s" } +# 判断 systemd 是否可用(仅有 systemctl 命令但 PID 1 不是 systemd 时视为不可用) +systemd_ready() { + command -v systemctl >/dev/null 2>&1 || return 1 + systemctl show --property=Version --value >/dev/null 2>&1 || return 1 + return 0 +} + # ========================= # systemd 安装与启动 # ========================= Service_Enabled="unknown" Service_Started="unknown" +Systemd_Usable="false" -if command -v systemctl >/dev/null 2>&1; then - CLASH_SERVICE_USER="$Service_User" CLASH_SERVICE_GROUP="$Service_Group" "$Install_Dir/scripts/install_systemd.sh" +if systemd_ready; then + Systemd_Usable="true" +fi - if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ]; then - systemctl enable "${Service_Name}.service" >/dev/null 2>&1 || true - fi - if [ "${CLASH_START_SERVICE:-true}" = "true" ]; then - systemctl start "${Service_Name}.service" >/dev/null 2>&1 || true - fi +if [ "$Systemd_Usable" = "true" ]; then + if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ] || [ "${CLASH_START_SERVICE:-true}" = "true" ]; then + CLASH_SERVICE_USER="$Service_User" CLASH_SERVICE_GROUP="$Service_Group" "$Install_Dir/scripts/install_systemd.sh" - if systemctl is-enabled --quiet "${Service_Name}.service" 2>/dev/null; then - Service_Enabled="enabled" + if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ]; then + systemctl enable "${Service_Name}.service" >/dev/null 2>&1 || true + fi + if [ "${CLASH_START_SERVICE:-true}" = "true" ]; then + systemctl start "${Service_Name}.service" >/dev/null 2>&1 || true + fi + + if systemctl is-enabled --quiet "${Service_Name}.service" 2>/dev/null; then + Service_Enabled="enabled" + else + Service_Enabled="disabled" + fi + + if systemctl is-active --quiet "${Service_Name}.service" 2>/dev/null; then + Service_Started="active" + else + Service_Started="inactive" + fi else + info "已按配置跳过 systemd 服务安装与启动(CLASH_ENABLE_SERVICE=false 且 CLASH_START_SERVICE=false)" Service_Enabled="disabled" - fi - - if systemctl is-active --quiet "${Service_Name}.service" 2>/dev/null; then - Service_Started="active" - else Service_Started="inactive" fi else - warn "未检测到 systemd,已跳过服务单元生成" + if command -v systemctl >/dev/null 2>&1; then + warn "检测到 systemctl 命令,但当前环境不可用 systemd(常见于 Docker 容器),已跳过服务单元生成" + else + warn "未检测到 systemd,已跳过服务单元生成" + fi fi # ========================= @@ -394,7 +416,7 @@ install_profiled() { [ "$http_port" = "auto" ] && http_port="7890" # 只写 IPv4 loopback,避免某些环境 ::1 解析问题 - sudo tee "$PROFILED_FILE" >/dev/null </dev/null </dev/null 2>&1; then +if [ "$Systemd_Usable" = "true" ]; then section "服务状态" se="${Service_Enabled:-unknown}" @@ -464,6 +486,11 @@ if command -v systemctl >/dev/null 2>&1; then log "${C_BOLD}常用命令:${C_NC}" log " $(cmd "sudo systemctl status ${Service_Name}.service")" log " $(cmd "sudo systemctl restart ${Service_Name}.service")" +else + section "服务状态" + warn "当前环境未启用 systemd(如 Docker 容器),请使用 clashctl 管理进程" + log " $(cmd "sudo clashctl start")" + log " $(cmd "sudo clashctl restart")" fi # ========================= @@ -514,7 +541,11 @@ else log " $(cmd "sudo bash -c 'echo \"CLASH_URL=<订阅地址>\" > ${ENV_FILE}'")" log "" log "配置完成后重启服务:" - log " $(cmd "sudo systemctl restart ${Service_Name}.service")" + if [ "$Systemd_Usable" = "true" ]; then + log " $(cmd "sudo systemctl restart ${Service_Name}.service")" + else + log " $(cmd "sudo clashctl restart")" + fi fi # ========================= @@ -535,9 +566,9 @@ fi # 启动后快速诊断 # ========================= sleep 1 -if command -v journalctl >/dev/null 2>&1; then +if [ "$Systemd_Usable" = "true" ] && command -v journalctl >/dev/null 2>&1; then if journalctl -u "${Service_Name}.service" -n 50 --no-pager 2>/dev/null \ | grep -q "Clash订阅地址不可访问"; then warn "服务启动异常:订阅不可用,请检查 CLASH_URL(可能过期 / 404 / 被墙)。" fi -fi \ No newline at end of file +fi diff --git a/start.sh b/start.sh index 80b45f2..9bd352d 100644 --- a/start.sh +++ b/start.sh @@ -88,6 +88,7 @@ URL="${CLASH_URL:-}" # 清理可能的 CRLF(Windows 写 .env 很常见) URL="$(printf '%s' "$URL" | tr -d '\r')" +URL="$(printf '%s' "$URL" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" #让 bash 子进程能拿到 export CLASH_URL="$URL" @@ -97,6 +98,10 @@ if [ -z "$URL" ] && [ "${SYSTEMD_MODE:-false}" != "true" ]; then echo "[ERR] CLASH_URL 为空(未配置订阅地址)" exit 2 fi +if [ -n "$URL" ] && ! printf '%s' "$URL" | grep -Eq '^https?://'; then + echo "[ERR] CLASH_URL 格式无效:必须以 http:// 或 https:// 开头" >&2 + exit 2 +fi # 获取 CLASH_SECRET 值:优先 .env;其次读取旧 config;占位符视为无效;最后生成随机值 Secret="${CLASH_SECRET:-}" From 3740c60d8975ef04eae2393d7ab78d88eee77bf9 Mon Sep 17 00:00:00 2001 From: Jalen Yan Date: Tue, 3 Mar 2026 11:08:08 +0800 Subject: [PATCH 04/33] Fix brace parsing bug in CLASH_DOWNLOAD_URL_TEMPLATE default value The `}` in `{arch}` prematurely closes the `${...:-...}` parameter expansion, causing the default URL to be truncated to `clash-{arch.gz}` instead of `clash-{arch}.gz`. The subsequent `{arch}` replacement then fails silently. Extract the default URL into a separate variable to avoid the nested brace conflict. --- scripts/resolve_clash.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/resolve_clash.sh b/scripts/resolve_clash.sh index 06a7357..d1edb6f 100755 --- a/scripts/resolve_clash.sh +++ b/scripts/resolve_clash.sh @@ -36,7 +36,8 @@ download_clash_bin() { return 1 fi - download_url="${CLASH_DOWNLOAD_URL_TEMPLATE:-https://github.com/Dreamacro/clash/releases/latest/download/clash-{arch}.gz}" + local _default_url="https://github.com/Dreamacro/clash/releases/latest/download/clash-{arch}.gz" + download_url="${CLASH_DOWNLOAD_URL_TEMPLATE:-$_default_url}" if [ -z "$download_url" ]; then echo -e "\033[33m[WARN] 未设置 CLASH_DOWNLOAD_URL_TEMPLATE,跳过 Clash 内核自动下载\033[0m" return 1 From 057733ca08a370b98469eac2ff3d201e1dead7a6 Mon Sep 17 00:00:00 2001 From: wnlen <62139570+wnlen@users.noreply.github.com> Date: Tue, 3 Mar 2026 21:37:08 +0800 Subject: [PATCH 05/33] Update README with public access setup instructions Add instructions for public access configuration and service restart. --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 17b5af3..f3706cd 100644 --- a/README.md +++ b/README.md @@ -117,6 +117,19 @@ http://127.0.0.1:9090/ui > 不建议直接将管理端口暴露到公网。 +如果执意想要**公网访问** +编辑 `.env` 文件,设置公网访问并修改对外端口(建议范围20000–60000): + +``` +sudo bash -c 'echo "EXTERNAL_CONTROLLER=0.0.0.0:9099" > /opt/clash-for-linux/.env' +``` + +配置完成后,**重启服务使配置生效**: + +``` +sudo systemctl restart clash-for-linux.service +``` + ------ ## ▶️ 开启 / 关闭系统代理 From 6725ff5555949f702e6f8b061e7a9294ed628b00 Mon Sep 17 00:00:00 2001 From: Arvin <62139570+wnlen@users.noreply.github.com> Date: Tue, 3 Mar 2026 22:06:20 +0800 Subject: [PATCH 06/33] Clarify public access instructions in README Rephrase instructions for public access in README. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f3706cd..393a3fc 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ http://127.0.0.1:9090/ui > 不建议直接将管理端口暴露到公网。 -如果执意想要**公网访问** +如果想要**公网访问** 编辑 `.env` 文件,设置公网访问并修改对外端口(建议范围20000–60000): ``` From a8014e6759e1ddacc804fbfd4dde8d1cb1f0ab99 Mon Sep 17 00:00:00 2001 From: Arvin <62139570+wnlen@users.noreply.github.com> Date: Tue, 3 Mar 2026 22:10:23 +0800 Subject: [PATCH 07/33] Update README with clearer public access instructions Clarify instructions for public access and key retrieval --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 393a3fc..0fa5908 100644 --- a/README.md +++ b/README.md @@ -118,7 +118,7 @@ http://127.0.0.1:9090/ui > 不建议直接将管理端口暴露到公网。 如果想要**公网访问** -编辑 `.env` 文件,设置公网访问并修改对外端口(建议范围20000–60000): +编辑 `.env` 文件,设置公网访问并修改对外端口: ``` sudo bash -c 'echo "EXTERNAL_CONTROLLER=0.0.0.0:9099" > /opt/clash-for-linux/.env' @@ -130,6 +130,13 @@ sudo bash -c 'echo "EXTERNAL_CONTROLLER=0.0.0.0:9099" > /opt/clash-for-linux/.en sudo systemctl restart clash-for-linux.service ``` +密钥留空时:脚本可自动生成随机值 +获取密钥命令: +``` +sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' "/opt/clash-for-linux/conf/config.yaml" | head -n 1 +``` + + ------ ## ▶️ 开启 / 关闭系统代理 From 9858d27216ae8dfd91abcdc6934c0b24cb2dbceb Mon Sep 17 00:00:00 2001 From: Arvin <62139570+wnlen@users.noreply.github.com> Date: Tue, 3 Mar 2026 22:12:22 +0800 Subject: [PATCH 08/33] Revise public access setup instructions in README Updated instructions for public access configuration in README. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 0fa5908..56961cf 100644 --- a/README.md +++ b/README.md @@ -118,10 +118,10 @@ http://127.0.0.1:9090/ui > 不建议直接将管理端口暴露到公网。 如果想要**公网访问** -编辑 `.env` 文件,设置公网访问并修改对外端口: +编辑 `.env` 文件,设置公网访问(对外端口不用改,改了机器人也能扫到,密钥设置的长点就行): ``` -sudo bash -c 'echo "EXTERNAL_CONTROLLER=0.0.0.0:9099" > /opt/clash-for-linux/.env' +sudo bash -c 'echo "EXTERNAL_CONTROLLER=0.0.0.0:9090" > /opt/clash-for-linux/.env' ``` 配置完成后,**重启服务使配置生效**: From 4ea89a8e8f7607ea770a946fff653bcfbcf8d3ae Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Sun, 15 Mar 2026 15:21:05 +0800 Subject: [PATCH 09/33] Update install.sh --- install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 3b7aef9..8c6fe9d 100755 --- a/install.sh +++ b/install.sh @@ -5,7 +5,7 @@ set -euo pipefail # 基础参数 # ========================= Server_Dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -Install_Dir="${CLASH_INSTALL_DIR:-/opt/clash-for-linux}" +Install_Dir="${CLASH_INSTALL_DIR:-$Server_Dir}" Service_Name="clash-for-linux" Service_User="root" Service_Group="root" From 63755f5e05b7a638859315b22d65889a3a3a7a2c Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Mon, 16 Mar 2026 21:56:32 +0800 Subject: [PATCH 10/33] Update install_systemd.sh --- scripts/install_systemd.sh | 57 +++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/scripts/install_systemd.sh b/scripts/install_systemd.sh index 04b99e9..b581131 100755 --- a/scripts/install_systemd.sh +++ b/scripts/install_systemd.sh @@ -10,47 +10,63 @@ Service_User="root" Service_Group="root" Unit_Path="/etc/systemd/system/${Service_Name}.service" -PID_FILE="$Server_Dir/temp/clash.pid" +Env_File="$Server_Dir/temp/clash-for-linux.sh" #################### 权限检查 #################### if [ "$(id -u)" -ne 0 ]; then - echo -e "\033[31m[ERROR] 需要 root 权限来安装 systemd 单元\033[0m" + echo -e "[ERROR] 需要 root 权限来安装 systemd 单元" exit 1 fi #################### 目录初始化 #################### -install -d -m 0755 \ - "$Server_Dir/conf" \ - "$Server_Dir/logs" \ - "$Server_Dir/temp" +install -d -m 0755 "$Server_Dir/conf" "$Server_Dir/logs" "$Server_Dir/temp" + +# 预创建 env 文件,避免 systemd 因路径不存在报错 +: > "$Env_File" +chmod 0644 "$Env_File" #################### 生成 systemd Unit #################### -cat >"$Unit_Path"<"$Unit_Path" </dev/null 2>&1 || true -echo -e "\033[32m[OK] 已生成 systemd 单元: ${Unit_Path}\033[0m" -echo -e "可执行以下命令启动服务:" -echo -e " sudo systemctl enable --now ${Service_Name}.service" +echo -e "[OK] 已生成 systemd 单元: ${Unit_Path}" +echo -e "已启用开机自启,可执行以下命令启动服务:" +echo -e " systemctl restart ${Service_Name}.service" +echo -e "查看状态:" +echo -e " systemctl status ${Service_Name}.service -l --no-pager" From 8c5a016dab9e51fbb18f43a76c0f29acf3eeb904 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Mon, 16 Mar 2026 21:56:34 +0800 Subject: [PATCH 11/33] Update install.sh --- install.sh | 1342 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 836 insertions(+), 506 deletions(-) diff --git a/install.sh b/install.sh index 8c6fe9d..4dad35e 100755 --- a/install.sh +++ b/install.sh @@ -1,574 +1,904 @@ -#!/bin/bash +#!/usr/bin/env bash +# 严格模式 set -euo pipefail -# ========================= -# 基础参数 -# ========================= -Server_Dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) -Install_Dir="${CLASH_INSTALL_DIR:-$Server_Dir}" -Service_Name="clash-for-linux" -Service_User="root" -Service_Group="root" +# --- DEBUG: 打印具体失败的行号和命令(systemd 下非常关键) --- +trap 'rc=$?; echo "[ERR] rc=$rc line=$LINENO cmd=$BASH_COMMAND" >&2' ERR +# 如需更详细:取消下一行注释 +# set -x +# --- DEBUG end --- -# ========================= -# 彩色输出(统一 printf + 自动降级 + 手动关色) -# ========================= +############################################ +# Clash for Linux - start.sh (Full Version) +# - systemd 模式下订阅失败/下载失败:不退出,使用 conf/config.yaml(必要时从 conf/fallback_config.yaml 拷贝)兜底启动 +# - 非 systemd 模式:订阅失败/下载失败直接退出(保持手动执行的强约束) +############################################ -# ---- 关色开关(优先级最高)---- -NO_COLOR_FLAG=0 -for arg in "$@"; do - case "$arg" in - --no-color|--nocolor) - NO_COLOR_FLAG=1 - ;; - esac -done +# 加载系统函数库(Only for RHEL Linux) +[ -f /etc/init.d/functions ] && source /etc/init.d/functions -if [[ -n "${NO_COLOR:-}" ]] || [[ -n "${CLASH_NO_COLOR:-}" ]]; then - NO_COLOR_FLAG=1 +#################### 脚本初始化任务 #################### + +# 获取脚本工作目录绝对路径 +export Server_Dir +Server_Dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# 加载.env变量文件 +# shellcheck disable=SC1090 +# --- source .env(不可信输入,必须放宽) --- +if [ -f "$Server_Dir/.env" ]; then + set +u + source "$Server_Dir/.env" || echo "[WARN] failed to source .env" >&2 + set -u fi -# ---- 初始化颜色 ---- -if [[ "$NO_COLOR_FLAG" -eq 0 ]] && [[ -t 1 ]] && command -v tput >/dev/null 2>&1; then - if tput setaf 1 >/dev/null 2>&1; then - C_RED="$(tput setaf 1)" - C_GREEN="$(tput setaf 2)" - C_YELLOW="$(tput setaf 3)" - C_BLUE="$(tput setaf 4)" - C_CYAN="$(tput setaf 6)" - C_GRAY="$(tput setaf 8 2>/dev/null || true)" - C_BOLD="$(tput bold)" - C_UL="$(tput smul)" - C_NC="$(tput sgr0)" - fi -fi +# systemd 模式开关(必须在 set -u 下安全) +SYSTEMD_MODE="${SYSTEMD_MODE:-false}" -# ---- ANSI fallback ---- -if [[ "$NO_COLOR_FLAG" -eq 0 ]] && [[ -t 1 ]] && [[ -z "${C_NC:-}" ]]; then - C_RED=$'\033[31m' - C_GREEN=$'\033[32m' - C_YELLOW=$'\033[33m' - C_BLUE=$'\033[34m' - C_CYAN=$'\033[36m' - C_GRAY=$'\033[90m' - C_BOLD=$'\033[1m' - C_UL=$'\033[4m' - C_NC=$'\033[0m' -fi - -# ---- 强制无色 ---- -if [[ "$NO_COLOR_FLAG" -eq 1 ]] || [[ ! -t 1 ]]; then - C_RED='' C_GREEN='' C_YELLOW='' C_BLUE='' C_CYAN='' C_GRAY='' C_BOLD='' C_UL='' C_NC='' -fi - -# ========================= -# 基础输出函数 -# ========================= -log() { printf "%b\n" "$*"; } -info() { log "${C_CYAN}[INFO]${C_NC} $*"; } -ok() { log "${C_GREEN}[OK]${C_NC} $*"; } -warn() { log "${C_YELLOW}[WARN]${C_NC} $*"; } -err() { log "${C_RED}[ERROR]${C_NC} $*"; } - -# ========================= -# 样式助手 -# ========================= -path() { printf "%b" "${C_BOLD}$*${C_NC}"; } -cmd() { printf "%b" "${C_GRAY}$*${C_NC}"; } -url() { printf "%b" "${C_UL}$*${C_NC}"; } -good() { printf "%b" "${C_GREEN}$*${C_NC}"; } -bad() { printf "%b" "${C_RED}$*${C_NC}"; } - -# ========================= -# 分段标题(CLI 风格 section) -# ========================= -section() { - local title="$*" - log "" - log "${C_BOLD}▶ ${title}${C_NC}" - log "${C_GRAY}────────────────────────────────────────${C_NC}" -} - -# ========================= -# 前置校验 -# ========================= +# root-only 强约束:不是 root 直接退出 if [ "$(id -u)" -ne 0 ]; then - err "需要 root 权限执行安装脚本(请使用 sudo bash install.sh)" - exit 1 + echo "[ERR] root-only mode: please run as root" >&2 + exit 2 fi -if [ ! -f "${Server_Dir}/.env" ]; then - err "未找到 .env 文件,请确认脚本所在目录:${Server_Dir}" - exit 1 +# 给二进制启动程序、脚本等添加可执行权限 +chmod +x "$Server_Dir/bin/"* 2>/dev/null || true +chmod +x "$Server_Dir/scripts/"* 2>/dev/null || true +if [ -f "$Server_Dir/tools/subconverter/subconverter" ]; then + chmod +x "$Server_Dir/tools/subconverter/subconverter" 2>/dev/null || true fi -# ========================= -# 同步到安装目录(保持你原逻辑) -# ========================= -mkdir -p "$Install_Dir" -if [ "$Server_Dir" != "$Install_Dir" ]; then - info "同步项目文件到安装目录:${Install_Dir}" - if command -v rsync >/dev/null 2>&1; then - rsync -a --delete --exclude '.git' "$Server_Dir/" "$Install_Dir/" - else - cp -a "$Server_Dir/." "$Install_Dir/" - fi -fi +#################### 变量设置 #################### -chmod +x "$Install_Dir"/*.sh 2>/dev/null || true -chmod +x "$Install_Dir"/scripts/* 2>/dev/null || true -chmod +x "$Install_Dir"/bin/* 2>/dev/null || true -chmod +x "$Install_Dir"/clashctl 2>/dev/null || true +Conf_Dir="$Server_Dir/conf" -# ========================= -# 加载环境与依赖脚本 -# ========================= -# shellcheck disable=SC1090 -source "$Install_Dir/.env" -# shellcheck disable=SC1090 -source "$Install_Dir/scripts/get_cpu_arch.sh" -# shellcheck disable=SC1090 -source "$Install_Dir/scripts/resolve_clash.sh" -# shellcheck disable=SC1090 -source "$Install_Dir/scripts/port_utils.sh" +# root-only:统一使用安装目录下的 temp/logs +Temp_Dir="$Server_Dir/temp" +Log_Dir="$Server_Dir/logs" -if [[ -z "${CpuArch:-}" ]]; then - err "无法识别 CPU 架构" - exit 1 -fi -info "CPU architecture: ${CpuArch}" - -# ========================= -# .env 写入工具:write_env_kv(必须在 prompt 之前定义) -# - 自动创建文件 -# - 存在则替换,不存在则追加 -# - 统一写成:export KEY="VALUE" -# - 自动转义双引号/反斜杠 -# ========================= -escape_env_value() { - printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' +mkdir -p "$Conf_Dir" "$Temp_Dir" "$Log_Dir" || { + echo "[ERR] cannot create dirs: Conf_Dir=$Conf_Dir Temp_Dir=$Temp_Dir Log_Dir=$Log_Dir" + exit 2 } -write_env_kv() { - local file="$1" - local key="$2" - local val="$3" +# 再做一次可写性检查,避免后面玄学 exit +touch "$Temp_Dir/.write_test" 2>/dev/null || { echo "[ERR] Temp_Dir not writable: $Temp_Dir"; exit 2; } +rm -f "$Temp_Dir/.write_test" 2>/dev/null || true - mkdir -p "$(dirname "$file")" 2>/dev/null || true - [ -f "$file" ] || touch "$file" +PID_FILE="${CLASH_PID_FILE:-$Temp_Dir/clash.pid}" - val="$(printf '%s' "$val" | tr -d '\r')" - local esc - esc="$(escape_env_value "$val")" - - if grep -qE "^[[:space:]]*(export[[:space:]]+)?${key}=" "$file"; then - sed -i -E "s|^[[:space:]]*(export[[:space:]]+)?${key}=.*|export ${key}=\"${esc}\"|g" "$file" - else - printf 'export %s="%s"\n' "$key" "$esc" >> "$file" - fi -} - -# ========================= -# 交互式填写订阅地址(仅在 CLASH_URL 为空时触发) -# - 若非 TTY(CI/管道)则跳过交互 -# - 若用户回车跳过,则保持原行为:装完提示手动配置 -# ========================= -prompt_clash_url_if_empty() { - # 兼容 .env 里可能是 CLASH_URL= / export CLASH_URL= / 带引号 - local cur="${CLASH_URL:-}" - cur="${cur%\"}"; cur="${cur#\"}" - - if [ -n "$cur" ]; then - return 0 - fi - - # 非交互环境:不阻塞 - if [ ! -t 0 ]; then - warn "CLASH_URL 为空且当前为非交互环境(stdin 非 TTY),将跳过输入引导。" - return 0 - fi - - echo - warn "未检测到订阅地址(CLASH_URL 为空)" - echo "请粘贴你的 Clash 订阅地址(直接回车跳过,稍后手动编辑 .env):" - read -r -p "Clash URL: " input_url - - input_url="$(printf '%s' "$input_url" | tr -d '\r')" - - # 回车跳过:保持原行为(不写入) - if [ -z "$input_url" ]; then - warn "已跳过填写订阅地址,安装完成后请手动编辑:${Install_Dir}/.env" - return 0 - fi - - # 先校验再写入,避免污染 .env - if ! echo "$input_url" | grep -Eq '^https?://'; then - err "订阅地址格式不正确(必须以 http:// 或 https:// 开头)" - exit 1 - fi - - ENV_FILE="${Install_Dir}/.env" - mkdir -p "$Install_Dir" - [ -f "$ENV_FILE" ] || touch "$ENV_FILE" - - # ✅ 只用这一套写入逻辑(统一 export KEY="...",兼容旧格式) - write_env_kv "$ENV_FILE" "CLASH_URL" "$input_url" - - export CLASH_URL="$input_url" - ok "已写入订阅地址到:${ENV_FILE}" -} - -prompt_clash_url_if_empty - -# ========================= -# 端口冲突检测(保持你原逻辑) -# ========================= -CLASH_HTTP_PORT=${CLASH_HTTP_PORT:-7890} -CLASH_SOCKS_PORT=${CLASH_SOCKS_PORT:-7891} -CLASH_REDIR_PORT=${CLASH_REDIR_PORT:-7892} -EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-127.0.0.1:9090} - -parse_port() { - local raw="$1" - raw="${raw##*:}" - echo "$raw" -} - -Port_Conflicts=() -for port in "$CLASH_HTTP_PORT" "$CLASH_SOCKS_PORT" "$CLASH_REDIR_PORT" "$(parse_port "$EXTERNAL_CONTROLLER")"; do - if [ "$port" = "auto" ] || [ -z "$port" ]; then - continue - fi - if [[ "$port" =~ ^[0-9]+$ ]]; then - if is_port_in_use "$port"; then - Port_Conflicts+=("$port") - fi - fi -done - -if [ "${#Port_Conflicts[@]}" -ne 0 ]; then - warn "检测到端口冲突: ${Port_Conflicts[*]},运行时将自动分配可用端口" -fi - -install -d -m 0755 "$Install_Dir/conf" "$Install_Dir/logs" "$Install_Dir/temp" - -# ========================= -# Clash 内核就绪检查/下载 -# ========================= -if ! resolve_clash_bin "$Install_Dir" "$CpuArch" >/dev/null 2>&1; then - err "Clash 内核未就绪,请检查下载配置或手动放置二进制" - exit 1 -fi - -# ========================= -# fonction 工具函数区 -# ========================= -# 等待 config.yaml 出现并写入 secret(默认最多等 6 秒) -wait_secret_ready() { - local conf_file="$1" - local timeout_sec="${2:-6}" - - local end=$((SECONDS + timeout_sec)) - while [ "$SECONDS" -lt "$end" ]; do - if [ -s "$conf_file" ] && grep -qE '^[[:space:]]*secret:' "$conf_file"; then +is_running() { + if [ -f "$PID_FILE" ]; then + local pid + pid="$(cat "$PID_FILE" 2>/dev/null || true)" + if [ -n "${pid:-}" ] && kill -0 "$pid" 2>/dev/null; then return 0 fi - sleep 0.2 - done + fi return 1 } -# 计算字符串可视宽度:中文大概率按 2 宽处理(简单够用版) -# 注:终端宽度/字体不统一时,中文宽度估算永远只能“近似” -vis_width() { - python3 - <<'PY' "$1" -import sys -s=sys.argv[1] -w=0 -for ch in s: - # East Asian Wide/FullWidth 近似当 2 - w += 2 if ord(ch) >= 0x2E80 else 1 -print(w) -PY +if [ "${SYSTEMD_MODE:-false}" != "true" ] && is_running; then + echo -e "\n[OK] Clash 已在运行 (pid=$(cat "$PID_FILE")),跳过重复启动\n" + exit 0 +fi + +# systemd 模式下避免读取遗留 pid 干扰判断 +if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + rm -f "$PID_FILE" 2>/dev/null || true +fi + +# 统一订阅变量 +URL="${CLASH_URL:-}" + +# 清理可能的 CRLF(Windows 写 .env 很常见) +URL="$(printf '%s' "$URL" | tr -d '\r')" +URL="$(printf '%s' "$URL" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" + +#让 bash 子进程能拿到 +export CLASH_URL="$URL" + +# 只有在“需要在线更新订阅”的模式下才强制要求 URL +if [ -z "$URL" ] && [ "${SYSTEMD_MODE:-false}" != "true" ]; then + echo "[ERR] CLASH_URL 为空(未配置订阅地址)" + exit 2 +fi +if [ -n "$URL" ] && ! printf '%s' "$URL" | grep -Eq '^https?://'; then + echo "[ERR] CLASH_URL 格式无效:必须以 http:// 或 https:// 开头" >&2 + exit 2 +fi + +# 获取 CLASH_SECRET 值:优先 .env;其次读取旧 config;占位符视为无效;最后生成随机值 +Secret="${CLASH_SECRET:-}" + +# 尝试从旧 config.yaml 读取(仅当 .env 未提供) +if [ -z "$Secret" ] && [ -f "$Conf_Dir/config.yaml" ]; then + Secret="$(awk -F': *' '/^[[:space:]]*secret[[:space:]]*:/{print $2; exit}' "$Conf_Dir/config.yaml" 2>/dev/null | tr -d '"' || true)" +fi + +# 若读取到的是占位符(如 ${CLASH_SECRET}),视为无效 +if [[ "$Secret" =~ ^\$\{.*\}$ ]]; then + Secret="" +fi + +# 兜底生成随机 secret +if [ -z "$Secret" ]; then + if command -v openssl >/dev/null 2>&1; then + Secret="$(openssl rand -hex 32)" + else + # 32 bytes -> 64 hex chars + Secret="$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')" + fi +fi + +# 强制写入 secret 到指定配置文件(存在则替换,不存在则追加) +force_write_secret() { + local file="$1" + [ -f "$file" ] || return 0 + + if grep -qE '^[[:space:]]*secret:' "$file"; then + # 替换整行 secret(无论原来是啥,包括 SECRET_PLACEHOLDER / "${CLASH_SECRET}") + sed -i -E "s|^[[:space:]]*secret:.*$|secret: ${Secret}|g" "$file" + else + # 没有 secret 行就追加到文件末尾 + printf "\nsecret: %s\n" "$Secret" >> "$file" + fi } -pad_right() { # pad_right "text" width - local s="$1" w="$2" - local cur - cur="$(vis_width "$s")" - local pad=$(( w - cur )) - (( pad < 0 )) && pad=0 - printf "%s%*s" "$s" "$pad" "" +ensure_ui_link() { + mkdir -p "$Conf_Dir" + ln -sfn "$Server_Dir/dashboard/public" "$Conf_Dir/ui" } -box_title() { # box_title "标题" width - local title="$1" width="$2" - local inner=$((width-2)) - printf "┌%s┐\n" "$(printf '─%.0s' $(seq 1 $inner))" - # 标题居中(近似) - local t=" $title " - local tw; tw="$(vis_width "$t")" - local left=$(( (inner - tw)/2 )); ((left<0)) && left=0 - local right=$(( inner - tw - left )); ((right<0)) && right=0 - printf "│%*s%s%*s│\n" "$left" "" "$t" "$right" "" - printf "├%s┤\n" "$(printf '─%.0s' $(seq 1 $inner))" +# --- helpers: upsert yaml key (top-level), ensure UI links --- +upsert_yaml_kv() { + # Usage: upsert_yaml_kv + # Writes: key: value (top-level) + local file="$1" key="$2" value="$3" + [ -n "$file" ] && [ -n "$key" ] || return 1 + + # 如果文件不存在,先创建 + [ -f "$file" ] || : >"$file" || return 1 + + if grep -qE "^[[:space:]]*${key}:[[:space:]]*" "$file" 2>/dev/null; then + # 替换整行(避免残留引号) + sed -i -E "s|^[[:space:]]*${key}:[[:space:]]*.*$|${key}: ${value}|g" "$file" + else + # 追加前保证有换行 + tail -c 1 "$file" 2>/dev/null | read -r _last || true + # shellcheck disable=SC2034 + if [ "$(tail -c 1 "$file" 2>/dev/null || true)" != "" ]; then + printf "\n" >>"$file" + fi + printf "%s: %s\n" "$key" "$value" >>"$file" + fi } -box_row() { # box_row "key" "value" width keyw - local k="$1" v="$2" width="$3" keyw="$4" - local inner=$((width-2)) - # 形如:│ key: value │ - local left="$(pad_right "$k" "$keyw")" - local line=" ${left} ${v}" - local lw; lw="$(vis_width "$line")" - local pad=$(( inner - lw )); ((pad<0)) && pad=0 - printf "│%s%*s│\n" "$line" "$pad" "" +ensure_ui_links() { + local ui_src="${UI_SRC_DIR:-$Server_Dir/dashboard/public}" + mkdir -p "$Conf_Dir" 2>/dev/null || true + if [ -d "$ui_src" ]; then + ln -sfn "$ui_src" "$Conf_Dir/ui" 2>/dev/null || true + fi } -box_end() { # box_end width - local width="$1" inner=$((width-2)) - printf "└%s┘\n" "$(printf '─%.0s' $(seq 1 $inner))" +force_write_controller_and_ui() { + local file="$1" + local controller="${EXTERNAL_CONTROLLER:-127.0.0.1:9090}" + + [ -n "$file" ] || return 1 + + # external-controller + upsert_yaml_kv "$file" "external-controller" "$controller" || true + + # external-ui: fixed to Conf_Dir/ui + ensure_ui_links + if [ -e "$Conf_Dir/ui" ]; then + upsert_yaml_kv "$file" "external-ui" "$Conf_Dir/ui" || true + fi } -# 从 config.yaml 提取 secret(强韧:支持缩进/引号/CRLF/尾空格) -read_secret_from_config() { - local conf_file="$1" - [ -f "$conf_file" ] || return 1 - # 1) 找到 secret 行 -> 2) 去掉 key 和空格 -> 3) 去掉首尾引号 -> 4) 去掉 CR - local s - s="$( - sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' "$conf_file" \ - | head -n 1 \ - | sed -E 's/^[[:space:]]*"(.*)"[[:space:]]*$/\1/; s/^[[:space:]]*'\''(.*)'\''[[:space:]]*$/\1/' \ - | tr -d '\r' - )" +fix_external_ui_by_safe_paths() { + local bin="$1" + local cfg="$2" + local test_out="$3" + local ui_src="${UI_SRC_DIR:-$Server_Dir/dashboard/public}" - # 去掉纯空格 - s="$(printf '%s' "$s" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" + [ -x "$bin" ] || return 0 + [ -s "$cfg" ] || return 0 - [ -n "$s" ] || return 1 - printf '%s' "$s" + # 先跑一次 test,把原因写入 test_out + "$bin" -t -f "$cfg" >"$test_out" 2>&1 + local rc=$? + [ $rc -eq 0 ] && return 0 + + # 只处理 external-ui 的 SAFE_PATH 报错 + if ! grep -q "SAFE_PATHS" "$test_out"; then + return $rc + fi + if ! grep -q "external-ui" "$cfg" && ! grep -q "external-ui" "$test_out"; then + return $rc + fi + + # 从 test_out 抽取 allowed paths 的第一个 base + # 例:allowed paths: [/opt/clash-for-linux/.config/mihomo] + local base + base="$(sed -n 's/.*allowed paths: \[\([^]]*\)\].*/\1/p' "$test_out" | head -n 1)" + + [ -n "$base" ] || return $rc + + # external-ui 必须在 allowed base 的子目录里 + local ui_dst="$base/ui" + mkdir -p "$ui_dst" 2>/dev/null || true + + # 把 UI 文件同步过去(真实目录,不用软链,避免跳出 base) + if [ -d "$ui_src" ]; then + if command -v rsync >/dev/null 2>&1; then + rsync -a --delete "$ui_src"/ "$ui_dst"/ 2>/dev/null || true + else + rm -rf "$ui_dst"/* 2>/dev/null || true + cp -a "$ui_src"/. "$ui_dst"/ 2>/dev/null || true + fi + fi + + # 重写 external-ui 到新目录 + upsert_yaml_kv "$cfg" "external-ui" "$ui_dst" || true + + # 再 test 一次 + "$bin" -t -f "$cfg" >"$test_out" 2>&1 + return $? } -# 判断 systemd 是否可用(仅有 systemctl 命令但 PID 1 不是 systemd 时视为不可用) -systemd_ready() { - command -v systemctl >/dev/null 2>&1 || return 1 - systemctl show --property=Version --value >/dev/null 2>&1 || return 1 +# 设置默认值 +CLASH_HTTP_PORT="${CLASH_HTTP_PORT:-7890}" +CLASH_SOCKS_PORT="${CLASH_SOCKS_PORT:-7891}" +CLASH_REDIR_PORT="${CLASH_REDIR_PORT:-7892}" +CLASH_LISTEN_IP="${CLASH_LISTEN_IP:-127.0.0.1}" +CLASH_ALLOW_LAN="${CLASH_ALLOW_LAN:-false}" + +EXTERNAL_CONTROLLER_ENABLED="${EXTERNAL_CONTROLLER_ENABLED:-true}" +EXTERNAL_CONTROLLER="${EXTERNAL_CONTROLLER:-127.0.0.1:9090}" + +ALLOW_INSECURE_TLS="${ALLOW_INSECURE_TLS:-false}" + +# 端口与配置工具 +# shellcheck disable=SC1090 +source "$Server_Dir/scripts/port_utils.sh" +CLASH_HTTP_PORT="$(resolve_port_value "HTTP" "$CLASH_HTTP_PORT")" +CLASH_SOCKS_PORT="$(resolve_port_value "SOCKS" "$CLASH_SOCKS_PORT")" +CLASH_REDIR_PORT="$(resolve_port_value "REDIR" "$CLASH_REDIR_PORT")" +EXTERNAL_CONTROLLER="$(resolve_host_port "External Controller" "$EXTERNAL_CONTROLLER" "127.0.0.1")" + +# shellcheck disable=SC1090 +source "$Server_Dir/scripts/config_utils.sh" + +#################### 函数定义 #################### + +# 自定义action函数,实现通用action功能(兼容 journald;关键错误会额外 echo 到 stderr) +success() { + echo -en "\033[60G[\033[1;32m OK \033[0;39m]\r" return 0 } -# ========================= -# systemd 安装与启动 -# ========================= -Service_Enabled="unknown" -Service_Started="unknown" -Systemd_Usable="false" +failure() { + local rc=$? + echo -en "\033[60G[\033[1;31mFAILED\033[0;39m]\r" + [ -x /bin/plymouth ] && /bin/plymouth --details + return "$rc" +} -if systemd_ready; then - Systemd_Usable="true" +action() { + local STRING + STRING=$1 + shift + + # 执行命令本身的成功/失败,不应让 UI 输出影响返回码 + if "$@"; then + success $"$STRING" || true + return 0 + else + failure $"$STRING" || true + return 1 + fi +} + +# 判断命令是否正常执行 +# - 手动模式:失败直接 exit +# - systemd 模式:只打印状态,不影响退出码 +if_success() { + local ok_msg=$1 + local fail_msg=$2 + local rc=$3 + + if [ "$rc" -eq 0 ]; then + action "$ok_msg" /bin/true || true + return 0 + fi + + # rc != 0 + action "$fail_msg" /bin/false || true + + if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + # systemd 下不允许在 UI 函数中 exit + return "$rc" + else + exit "$rc" + fi +} + +ensure_subconverter() { + local bin="${Server_Dir}/tools/subconverter/subconverter" + local port="25500" + + # 没有二进制直接跳过 + if [ ! -x "$bin" ]; then + echo "[WARN] subconverter bin not found: $bin" + export SUBCONVERTER_READY="false" + return 0 + fi + + # 已在监听则认为就绪 + if ss -lntp 2>/dev/null | grep -qE ":${port}[[:space:]]"; then + export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://127.0.0.1:${port}}" + export SUBCONVERTER_READY="true" + return 0 + fi + + # 启动(后台) + echo "[INFO] starting subconverter..." + (cd "${Server_Dir}/tools/subconverter" && nohup "./subconverter" >/dev/null 2>&1 &) + + # 等待端口起来 + for _ in 1 2 3 4 5; do + sleep 1 + if ss -lntp 2>/dev/null | grep -qE ":${port}[[:space:]]"; then + export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://127.0.0.1:${port}}" + export SUBCONVERTER_READY="true" + echo "[OK] subconverter ready at ${SUBCONVERTER_URL}" + return 0 + fi + done + + echo "[WARN] subconverter start failed or port not ready" + export SUBCONVERTER_READY="false" + return 0 +} + +#################### 任务执行 #################### + +## 获取CPU架构信息 +# shellcheck disable=SC1090 +source "$Server_Dir/scripts/get_cpu_arch.sh" + +if [[ -z "${CpuArch:-}" ]]; then + echo "[ERROR] Failed to obtain CPU architecture" >&2 + exit 2 fi -if [ "$Systemd_Usable" = "true" ]; then - if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ] || [ "${CLASH_START_SERVICE:-true}" = "true" ]; then - CLASH_SERVICE_USER="$Service_User" CLASH_SERVICE_GROUP="$Service_Group" "$Install_Dir/scripts/install_systemd.sh" +# shellcheck disable=SC1090 +source "$Server_Dir/scripts/resolve_clash.sh" - if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ]; then - systemctl enable "${Service_Name}.service" >/dev/null 2>&1 || true - fi - if [ "${CLASH_START_SERVICE:-true}" = "true" ]; then - systemctl start "${Service_Name}.service" >/dev/null 2>&1 || true - fi +## 临时取消环境变量 +unset http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY || true - if systemctl is-enabled --quiet "${Service_Name}.service" 2>/dev/null; then - Service_Enabled="enabled" +######################################################## +# systemd 兜底:如果没有可用订阅 URL,则确保有 config.yaml +######################################################## +ensure_fallback_config() { + # conf/config.yaml 为空或不存在,则从 fallback 拷贝 + if [ ! -s "$Conf_Dir/config.yaml" ]; then + if [ -s "$Server_Dir/conf/fallback_config.yaml" ]; then + cp -f "$Server_Dir/conf/fallback_config.yaml" "$Conf_Dir/config.yaml" + echo -e "\033[33m[WARN]\033[0m 已复制 fallback_config.yaml -> conf/config.yaml(兜底)" else - Service_Enabled="disabled" + echo -e "\033[31m[ERROR]\033[0m 未找到可用的 conf/fallback_config.yaml,无法兜底启动" >&2 + if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + return 1 + else + exit 1 + fi fi + fi - if systemctl is-active --quiet "${Service_Name}.service" 2>/dev/null; then - Service_Started="active" + # 强制写入真实 secret(失败时也遵循同样规则) + if ! force_write_secret "$Conf_Dir/config.yaml"; then + echo -e "\033[31m[ERROR]\033[0m 写入 secret 失败:$Conf_Dir/config.yaml" >&2 + if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + return 1 else - Service_Started="inactive" + exit 1 fi + fi + + return 0 +} +SKIP_CONFIG_REBUILD=false + +# systemd 模式下若 URL 为空:直接兜底启动 +if [ "${SYSTEMD_MODE}" = "true" ] && [ -z "${URL:-}" ]; then + echo -e "\033[33m[WARN]\033[0m SYSTEMD_MODE=true 且 CLASH_URL 为空,跳过订阅更新,使用本地兜底配置启动" + ensure_fallback_config || true + SKIP_CONFIG_REBUILD=true +fi + +#################### Clash 订阅地址检测及配置文件下载 #################### +if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then + echo -e '\n正在检测订阅地址...' + Text1="Clash订阅地址可访问!" + Text2="Clash订阅地址不可访问!" + + CHECK_CMD=(curl -o /dev/null -L -sS --retry 5 -m 10 --connect-timeout 10 -w "%{http_code}") + if [ "$ALLOW_INSECURE_TLS" = "true" ]; then + CHECK_CMD+=(-k) + echo -e "\033[33m[WARN]\033[0m 已启用不安全的 TLS 下载(跳过证书校验)" + fi + if [ -n "${CLASH_HEADERS:-}" ]; then + CHECK_CMD+=(-H "$CLASH_HEADERS") + fi + CHECK_CMD+=("$URL") + + # 不让 set -e 干扰获取状态码 + set +e + status_code="$("${CHECK_CMD[@]}")" + curl_rc=$? + set -e + + # curl 本身失败,视为不可用 + if [ "$curl_rc" -ne 0 ]; then + status_code="" + ReturnStatus=1 else - info "已按配置跳过 systemd 服务安装与启动(CLASH_ENABLE_SERVICE=false 且 CLASH_START_SERVICE=false)" - Service_Enabled="disabled" - Service_Started="inactive" + echo "$status_code" | grep -E '^[23][0-9]{2}$' &>/dev/null + ReturnStatus=$? + fi + + if [ "$ReturnStatus" -eq 0 ]; then + action "$Text1" /bin/true || true + else + if [ "$SYSTEMD_MODE" = "true" ]; then + action "$Text2(systemd 模式不退出,尝试使用旧配置/兜底配置)" /bin/false || true + echo -e "\033[33m[WARN]\033[0m Subscribe check failed: http_code=${status_code:-unknown}, url=${URL}" >&2 + ensure_fallback_config || true + SKIP_CONFIG_REBUILD=true + else + if_success "$Text1" "$Text2" "$ReturnStatus" + fi + fi +fi + +#################### 下载订阅并生成 config.yaml(非兜底路径) #################### +if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then + ensure_subconverter || true + echo -e '\n正在下载Clash配置文件...' + Text3="配置文件clash.yaml下载成功!" + Text4="配置文件clash.yaml下载失败!" + + # --- DBG: 显式打印并验证临时目录可写(systemd 下常见权限问题) --- + echo "[DBG] uid=$(id -u) user=$(id -un) SYSTEMD_MODE=${SYSTEMD_MODE:-}" + echo "[DBG] Server_Dir=$Server_Dir Conf_Dir=$Conf_Dir Temp_Dir=$Temp_Dir Log_Dir=$Log_Dir" + echo "[DBG] URL=$(printf '%q' "$URL")" + + mkdir -p "$Temp_Dir" 2>/dev/null || true + touch "$Temp_Dir/.write_test" 2>/dev/null || { echo "[ERR] Temp_Dir not writable: $Temp_Dir" >&2; exit 2; } + rm -f "$Temp_Dir/.write_test" 2>/dev/null || true + # --- DBG end --- + + CURL_CMD=(curl -fL -S --retry 2 --connect-timeout 10 -m 30 -o "$Temp_Dir/clash.yaml") + if [ "$ALLOW_INSECURE_TLS" = "true" ]; then + CURL_CMD+=(-k) + fi + if [ -n "${CLASH_HEADERS:-}" ]; then + CURL_CMD+=(-H "$CLASH_HEADERS") + fi + CURL_CMD+=("$URL") + + set +e + CURL_ERR="$Temp_Dir/curl.err" + : > "$CURL_ERR" + "${CURL_CMD[@]}" 2>>"$CURL_ERR" + ReturnStatus=$? + set -e + + echo "[DBG] curl rc=$ReturnStatus" + if [ -s "$CURL_ERR" ]; then + echo "[DBG] curl stderr (last 50 lines):" + tail -n 50 "$CURL_ERR" + fi + + if [ "$ReturnStatus" -ne 0 ]; then + WGET_CMD=(wget -q -O "$Temp_Dir/clash.yaml") + if [ "$ALLOW_INSECURE_TLS" = "true" ]; then + WGET_CMD+=(--no-check-certificate) + fi + if [ -n "${CLASH_HEADERS:-}" ]; then + WGET_CMD+=(--header="$CLASH_HEADERS") + fi + WGET_CMD+=("$URL") + + for _ in {1..10}; do + set +e + "${WGET_CMD[@]}" + ReturnStatus=$? + set -e + if [ "$ReturnStatus" -eq 0 ]; then + break + fi + done + fi + + CONFIG_FILE="${CONFIG_FILE:-$Temp_Dir/config.yaml}" + mkdir -p "$Temp_Dir" || true + + if [ "$ReturnStatus" -eq 0 ] && [ -s "$Temp_Dir/clash.yaml" ]; then + SRC_YAML="$Temp_Dir/clash.yaml" + + # 1) 判断是否是完整 Clash 配置(关键字段之一存在即可) + if grep -qE '^(proxies:|proxy-providers:|rules:|port:|mixed-port:|dns:)' "$SRC_YAML"; then + cp -f "$SRC_YAML" "$CONFIG_FILE" + echo "[INFO] subscription already is a full clash config" + else + # 2) 非完整配置:尝试用 subconverter 转换 + echo "[INFO] subscription is not a full config, try conversion via subconverter..." + + export IN_FILE="$SRC_YAML" + export OUT_FILE="$Temp_Dir/clash_converted.yaml" + + set +e + bash "$Server_Dir/scripts/clash_profile_conversion.sh" + conv_rc=$? + set -e + + if [ "$conv_rc" -eq 0 ] && [ -s "$OUT_FILE" ]; then + cp -f "$OUT_FILE" "$CONFIG_FILE" + echo "[INFO] conversion ok -> runtime config ready" + else + echo "[WARN] conversion skipped/failed, will keep original and rely on fallback" + cp -f "$SRC_YAML" "$CONFIG_FILE" + fi + fi + + # 3) 强制注入 external-controller / external-ui(运行态兜底) + force_write_controller_and_ui "$CONFIG_FILE" || true + + # 4) 强制注入 secret + force_write_secret "$CONFIG_FILE" || true + + # Optional: Fix test URLs to HTTPS for reliability (safe, narrow scope) + if [ "${FIX_TEST_URL_HTTPS:-true}" = "true" ] && [ -s "$CONFIG_FILE" ]; then + # 1) proxy-groups: url-test / fallback url + sed -i -E "s#(url:[[:space:]]*['\"])http://#\1https://#g" "$CONFIG_FILE" 2>/dev/null || true + + # 2) cfw-latency-url (some dashboards) + sed -i -E "s#(cfw-latency-url:[[:space:]]*['\"])http://#\1https://#g" "$CONFIG_FILE" 2>/dev/null || true + + # 3) proxy-providers health-check url (mihomo warns about this) + sed -i -E "s#(health-check:[[:space:]]*\n[[:space:]]*url:[[:space:]]*['\"])http://#\1https://#g" "$CONFIG_FILE" 2>/dev/null || true + fi + + # 5) 自检:失败则回退到旧配置(注意:脚本 set -e + trap ERR,必须 set +e 包裹) + BIN="${Server_Dir}/bin/clash-linux-amd64" + NEW_CFG="$CONFIG_FILE" + OLD_CFG="${Conf_Dir}/config.yaml" + TEST_OUT="$Temp_Dir/config.test.out" + + if [ -x "$BIN" ] && [ -f "$NEW_CFG" ]; then + # 先尝试自动修复 external-ui 的 SAFE_PATH 问题(内部会跑 -t) + set +e + fix_external_ui_by_safe_paths "$BIN" "$NEW_CFG" "$TEST_OUT" + test_rc=$? + set -e + + if [ "$test_rc" -ne 0 ]; then + echo "[ERROR] Generated config invalid, rc=$test_rc, reason(file=$TEST_OUT, size=$(wc -c <"$TEST_OUT" 2>/dev/null || echo 0))" >&2 + tail -n 120 "$TEST_OUT" >&2 || true + + echo "[ERROR] fallback to last good config: $OLD_CFG" >&2 + if [ -f "$OLD_CFG" ]; then + cp -f "$OLD_CFG" "$NEW_CFG" + else + echo "[FATAL] No valid config available, aborting startup" >&2 + exit 1 + fi + fi + fi + + echo "[INFO] Runtime config generated: $CONFIG_FILE (size=$(wc -c <"$CONFIG_FILE" 2>/dev/null || echo 0))" + else + echo "[WARN] Download did not produce clash.yaml (rc=$ReturnStatus), skip runtime config generation" >&2 + fi + + if [ "$ReturnStatus" -eq 0 ]; then + action "$Text3" /bin/true || true + else + if [ "$SYSTEMD_MODE" = "true" ]; then + action "$Text4(systemd 模式:下载失败,使用旧配置/兜底配置继续启动)" /bin/false || true + echo -e "\033[33m[WARN]\033[0m Download failed, will fallback. url=${URL}" >&2 + ensure_fallback_config || true + SKIP_CONFIG_REBUILD=true + else + if_success "$Text3" "$Text4(退出启动)" "$ReturnStatus" + fi + fi +fi + +# ========================================================= +# 判断订阅是否已是完整 Clash YAML(Meta / Mihomo / Premium) +# 若是完整配置,则直接使用,跳过后续代理拆解与拼接 +# ========================================================= +if grep -qE '^(proxies:|proxy-providers:|mixed-port:|port:)' "$Temp_Dir/clash.yaml"; then + echo "[INFO] subscription is a full Clash config, use it directly" + cp -f "$Temp_Dir/clash.yaml" "$Conf_Dir/config.yaml" + + # 生成运行态(systemd non-root 实际启动用 Temp_Dir/config.yaml) + cp -f "$Temp_Dir/clash.yaml" "$Temp_Dir/config.yaml" + + # 写 controller/ui + secret(写到运行态) + force_write_controller_and_ui "$Temp_Dir/config.yaml" || true + force_write_secret "$Temp_Dir/config.yaml" || true + + # 同时把 conf/config.yaml 也补齐(方便你 grep/排查) + force_write_controller_and_ui "$Conf_Dir/config.yaml" || true + force_write_secret "$Conf_Dir/config.yaml" || true + + # 创建 UI 软链(systemd non-root 用 /tmp) + Dashboard_Src="$Server_Dir/dashboard/public" + if [ -d "$Dashboard_Src" ]; then + ln -sfn "$Dashboard_Src" "$Conf_Dir/ui" 2>/dev/null || true + fi + + SKIP_CONFIG_REBUILD=true + fi + +#################### 订阅转换/拼接(非兜底路径) #################### +if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then + # 运行期配置文件:默认用 Temp_Dir(systemd + clash 用户可写) + CONFIG_FILE="$Temp_Dir/config.yaml" + + # 1) 重命名订阅文件 + \cp -a "$Temp_Dir/clash.yaml" "$Temp_Dir/clash_config.yaml" + + # 2) 判断订阅内容是否符合 clash 配置文件标准,尝试转换(需 subconverter) + # shellcheck disable=SC1090 + source "$Server_Dir/scripts/resolve_subconverter.sh" + + if [ "${Subconverter_Ready:-false}" = "true" ]; then + echo -e '\n判断订阅内容是否符合clash配置文件标准:' + export SUBCONVERTER_BIN="$Subconverter_Bin" + bash "$Server_Dir/scripts/clash_profile_conversion.sh" + sleep 1 + else + echo -e "\033[33m[WARN]\033[0m 未检测到可用的 subconverter,跳过订阅转换" + fi + + # 3) 订阅形态判断: + # - 如果已经是完整 Clash 配置(Meta/Mihomo 常见 mixed-port / proxy-providers 等),直接用它作为运行配置 + # - 否则才走 “proxies: 抽取 + template 拼接” + if grep -qE '^(mixed-port:|port:|proxy-providers:|proxies:)' "$Temp_Dir/clash_config.yaml"; then + # 情况 A:完整配置(优先) + if grep -q '^proxies:' "$Temp_Dir/clash_config.yaml" || grep -q '^proxy-providers:' "$Temp_Dir/clash_config.yaml" || grep -q '^mixed-port:' "$Temp_Dir/clash_config.yaml" || grep -q '^port:' "$Temp_Dir/clash_config.yaml"; then + echo "[INFO] subscription looks like a full Clash config, use it directly" + cp -f "$Temp_Dir/clash_config.yaml" "$CONFIG_FILE" + # 写入 secret(运行态) + force_write_secret "$CONFIG_FILE" + # 直接跳过后续拼接流程 + SKIP_CONFIG_REBUILD=true + fi + fi + + # 情况 B:不是完整配置,才尝试抽取 proxies 并拼接 + if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then + if grep -q '^proxies:' "$Temp_Dir/clash_config.yaml"; then + sed -n '/^proxies:/,$p' "$Temp_Dir/clash_config.yaml" > "$Temp_Dir/proxy.txt" + else + echo "[ERROR] subscription is not a full config and also has no 'proxies:'; cannot build config." >&2 + # systemd 模式:兜底继续;非 systemd:退出 + if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + ensure_fallback_config || true + SKIP_CONFIG_REBUILD=true + else + exit 2 + fi + fi + fi + + # 4) 合并形成新的 config,并替换配置占位符 + if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then + cat "$Temp_Dir/templete_config.yaml" > "$CONFIG_FILE" + cat "$Temp_Dir/proxy.txt" >> "$CONFIG_FILE" + + sed -i "s/CLASH_HTTP_PORT_PLACEHOLDER/${CLASH_HTTP_PORT}/g" "$CONFIG_FILE" + sed -i "s/CLASH_SOCKS_PORT_PLACEHOLDER/${CLASH_SOCKS_PORT}/g" "$CONFIG_FILE" + sed -i "s/CLASH_REDIR_PORT_PLACEHOLDER/${CLASH_REDIR_PORT}/g" "$CONFIG_FILE" + sed -i "s/CLASH_LISTEN_IP_PLACEHOLDER/${CLASH_LISTEN_IP}/g" "$CONFIG_FILE" + sed -i "s/CLASH_ALLOW_LAN_PLACEHOLDER/${CLASH_ALLOW_LAN}/g" "$CONFIG_FILE" + fi + + # 5) 配置 external-controller + if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + sed -i "s/EXTERNAL_CONTROLLER_PLACEHOLDER/${EXTERNAL_CONTROLLER}/g" "$CONFIG_FILE" + else + sed -i "s/external-controller: 'EXTERNAL_CONTROLLER_PLACEHOLDER'/# external-controller: disabled/g" "$CONFIG_FILE" + fi + + apply_tun_config "$CONFIG_FILE" + apply_mixin_config "$CONFIG_FILE" "$Server_Dir" + + # 6) 是否同步到 conf(root/非 systemd 时才做;systemd+非root跳过) + \cp "$CONFIG_FILE" "$Conf_Dir/" + + # 7) Dashboard external-ui(systemd+非root:把 ui 放 Temp_Dir 下,避免写 conf) + Work_Dir="$(cd "$(dirname "$0")" && pwd)" + Dashboard_Src="${Work_Dir}/dashboard/public" + + if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + if [ "${SYSTEMD_MODE:-false}" = "true" ] && [ "$(id -u)" -ne 0 ]; then + # runtime ui path (writable) + Dashboard_Link="$Temp_Dir/ui" + if [ -d "$Dashboard_Src" ]; then + ln -sfn "$Dashboard_Src" "$Dashboard_Link" 2>/dev/null || true + fi + else + # conf ui path (root can manage) + Dashboard_Link="${Conf_Dir}/ui" + if [ -d "$Dashboard_Src" ]; then + ln -sfn "$Dashboard_Src" "$Dashboard_Link" || true + else + echo -e "\033[33m[WARN]\033[0m Dashboard source not found: $Dashboard_Src (external-ui may not work)" + fi + fi + + # ensure external-ui points to Dashboard_Link + if grep -qE '^[[:space:]]*external-ui:' "$CONFIG_FILE"; then + sed -i -E "s|^[[:space:]]*external-ui:.*$|external-ui: ${Dashboard_Link}|g" "$CONFIG_FILE" + else + printf "\nexternal-ui: %s\n" "$Dashboard_Link" >> "$CONFIG_FILE" + fi + fi + + # 8) 写入 secret(写到 runtime config) + force_write_secret "$CONFIG_FILE" + +else + # 兜底路径:尽量也写入 secret(conf/config.yaml 可写时) + if grep -qE '^secret:\s*' "$Conf_Dir/config.yaml" 2>/dev/null; then + force_write_secret "$Conf_Dir/config.yaml" + else + echo "secret: ${Secret}" >> "$Conf_Dir/config.yaml" || true + fi +fi + +#################### 启动Clash服务 #################### + +# 选择运行期配置文件与工作目录 +CONFIG_FILE="${CONFIG_FILE:-$Conf_Dir/config.yaml}" +RUNTIME_DIR="${Conf_Dir}" + +# 启动前确保配置文件存在且非空 +if [ ! -s "$CONFIG_FILE" ]; then + echo -e "\033[31m[ERROR]\033[0m config 不存在或为空:$CONFIG_FILE,无法启动 Clash" >&2 + exit 2 +fi + +# 最终护栏:禁止未渲染的占位符进入运行态 +if grep -q '\${' "$CONFIG_FILE"; then + echo "[ERROR] config contains unresolved placeholders (\${...}): $CONFIG_FILE" >&2 + exit 2 +fi + +# 确保运行目录存在且可写(clash/mihomo 可能会写 cache/geo 数据) +mkdir -p "$RUNTIME_DIR" 2>/dev/null || true +touch "$RUNTIME_DIR/.write_test" 2>/dev/null || { + echo "[ERROR] runtime dir not writable: $RUNTIME_DIR (uid=$(id -u))" >&2 + exit 2 +} +rm -f "$RUNTIME_DIR/.write_test" 2>/dev/null || true + +echo -e '\n正在启动Clash服务...' +Text5="服务启动成功!" +Text6="服务启动失败!" + +Clash_Bin="$(resolve_clash_bin "$Server_Dir" "$CpuArch")" +ReturnStatus=$? + +if [ "$ReturnStatus" -eq 0 ]; then + if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + echo "[INFO] SYSTEMD_MODE=true,前台启动交给 systemd 监管" + echo "[INFO] Using config: $CONFIG_FILE" + echo "[INFO] Using runtime dir: $RUNTIME_DIR" + + # systemd 前台:只用 -f 指定配置文件,-d 作为工作目录 + exec "$Clash_Bin" -f "$CONFIG_FILE" -d "$RUNTIME_DIR" + else + echo "[INFO] 后台启动 (nohup)" + echo "[INFO] Using config: $CONFIG_FILE" + echo "[INFO] Using runtime dir: $RUNTIME_DIR" + + nohup "$Clash_Bin" -f "$CONFIG_FILE" -d "$RUNTIME_DIR" >>"$Log_Dir/clash.log" 2>&1 & + PID=$! + ReturnStatus=$? + + if [ "$ReturnStatus" -eq 0 ]; then + echo "$PID" > "$PID_FILE" + fi + fi +fi + +if [ "${SYSTEMD_MODE:-false}" = "true" ]; then + if_success "$Text5" "$Text6" "$ReturnStatus" || true +else + if_success "$Text5" "$Text6" "$ReturnStatus" +fi + +#################### 输出信息 #################### + +echo '' +if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + echo -e "Clash Dashboard 访问地址: http://${EXTERNAL_CONTROLLER}/ui" + + SHOW_SECRET="${CLASH_SHOW_SECRET:-false}" + SHOW_SECRET_MASKED="${CLASH_SHOW_SECRET_MASKED:-true}" + + if [ "$SHOW_SECRET" = "true" ]; then + echo -e "Secret: ${Secret}" + elif [ "$SHOW_SECRET_MASKED" = "true" ]; then + # 脱敏:前4后4 + masked="${Secret:0:4}****${Secret: -4}" + echo -e "Secret: ${masked} (set CLASH_SHOW_SECRET=true to show full)" + else + echo -e "Secret: 已生成(未显示)。查看:/opt/clash-for-linux/conf/config.yaml 或 .env" fi else - if command -v systemctl >/dev/null 2>&1; then - warn "检测到 systemctl 命令,但当前环境不可用 systemd(常见于 Docker 容器),已跳过服务单元生成" - else - warn "未检测到 systemd,已跳过服务单元生成" - fi + echo -e "External Controller (Dashboard) 已禁用" fi +echo '' -# ========================= -# Shell 代理快捷命令 -# 生成:/etc/profile.d/clash-for-linux.sh -# ========================= -PROFILED_FILE="/etc/profile.d/clash-for-linux.sh" +#################### 写入代理环境变量文件 #################### -install_profiled() { - local http_port="${MIXED_PORT:-7890}" - # 兼容你后面可能支持 auto:auto 就先用 7890 - [ "$http_port" = "auto" ] && http_port="7890" +Env_File="${CLASH_ENV_FILE:-}" - # 只写 IPv4 loopback,避免某些环境 ::1 解析问题 - tee "$PROFILED_FILE" >/dev/null <"$Env_File"<}" - echo "https_proxy=\${https_proxy:-}" - echo "all_proxy=\${all_proxy:-}" +# 关闭系统代理 +function proxy_off() { + unset http_proxy + unset https_proxy + unset no_proxy + unset HTTP_PROXY + unset HTTPS_PROXY + unset NO_PROXY + echo -e "\033[31m[×] 已关闭代理\033[0m" } EOF - chmod 644 "$PROFILED_FILE" -} - -install_profiled || true - -# ========================= -# 安装 clashctl 命令 -# ========================= -if [ -f "$Install_Dir/clashctl" ]; then - install -m 0755 "$Install_Dir/clashctl" /usr/local/bin/clashctl -fi - -# ========================= -# 友好收尾输出(闭环) -# ========================= - -section "安装完成" -ok "Clash for Linux 已安装至: $(path "${Install_Dir}")" - -log "📦 安装目录:$(path "${Install_Dir}")" -log "👤 运行用户:${Service_User}:${Service_Group}" -log "🔧 服务名称:${Service_Name}.service" - -if [ "$Systemd_Usable" = "true" ]; then - section "服务状态" - - se="${Service_Enabled:-unknown}" - ss="${Service_Started:-unknown}" - - [[ "$se" == "enabled" ]] && se_colored="$(good "$se")" || se_colored="$(bad "$se")" - [[ "$ss" == "active" ]] && ss_colored="$(good "$ss")" || ss_colored="$(bad "$ss")" - - log "🧷 开机自启:${se_colored}" - log "🟢 服务状态:${ss_colored}" - - log "" - log "${C_BOLD}常用命令:${C_NC}" - log " $(cmd "sudo systemctl status ${Service_Name}.service")" - log " $(cmd "sudo systemctl restart ${Service_Name}.service")" -else - section "服务状态" - warn "当前环境未启用 systemd(如 Docker 容器),请使用 clashctl 管理进程" - log " $(cmd "sudo clashctl start")" - log " $(cmd "sudo clashctl restart")" -fi - -# ========================= -# Dashboard / Secret -# ========================= -section "控制面板" - -api_port="$(parse_port "${EXTERNAL_CONTROLLER}")" -api_host="${EXTERNAL_CONTROLLER%:*}" - -if [[ -z "$api_host" ]] || [[ "$api_host" == "$EXTERNAL_CONTROLLER" ]]; then - api_host="127.0.0.1" -fi - -CONF_DIR="$Install_Dir/conf" -CONF_FILE="$CONF_DIR/config.yaml" - -SECRET_VAL="" -if wait_secret_ready "$CONF_FILE" 6; then - SECRET_VAL="$(read_secret_from_config "$CONF_FILE" || true)" -fi - -dash="http://${api_host}:${api_port}/ui" -log "🌐 Dashboard:$(url "$dash")" - -if [[ -n "$SECRET_VAL" ]]; then - MASKED="${SECRET_VAL:0:4}****${SECRET_VAL: -4}" - log "🔐 Secret:${C_YELLOW}${MASKED}${C_NC}" - log " 查看完整 Secret:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_FILE\" | head -n 1")" -else - log "🔐 Secret:${C_YELLOW}启动中暂未读到(稍后再试)${C_NC}" - log " 稍后查看:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_FILE\" | head -n 1")" -fi - -# ========================= -# 订阅配置(必须) -# ========================= -section "订阅状态" - -ENV_FILE="${Install_Dir}/.env" - -if [[ -n "${CLASH_URL:-}" ]]; then - ok "订阅地址已配置(CLASH_URL 已写入 .env)" -else - warn "订阅地址未配置(必须)" - log "" - log "配置订阅地址:" - log " $(cmd "sudo bash -c 'echo \"CLASH_URL=<订阅地址>\" > ${ENV_FILE}'")" - log "" - log "配置完成后重启服务:" - if [ "$Systemd_Usable" = "true" ]; then - log " $(cmd "sudo systemctl restart ${Service_Name}.service")" - else - log " $(cmd "sudo clashctl restart")" - fi -fi - -# ========================= -# 下一步 -# ========================= -section "下一步开启代理(可选)" - -PROFILED_FILE="/etc/profile.d/clash-for-linux.sh" - -if [ -f "$PROFILED_FILE" ]; then - log " $(cmd "source $PROFILED_FILE")" - log " $(cmd "proxy_on")" -else - log " (未安装 Shell 代理快捷命令,跳过)" -fi - -# ========================= -# 启动后快速诊断 -# ========================= -sleep 1 -if [ "$Systemd_Usable" = "true" ] && command -v journalctl >/dev/null 2>&1; then - if journalctl -u "${Service_Name}.service" -n 50 --no-pager 2>/dev/null \ - | grep -q "Clash订阅地址不可访问"; then - warn "服务启动异常:订阅不可用,请检查 CLASH_URL(可能过期 / 404 / 被墙)。" - fi + echo -e "请执行以下命令加载环境变量: source ${Env_File}\n" + echo -e "请执行以下命令开启系统代理: proxy_on\n" + echo -e "若要临时关闭系统代理,请执行: proxy_off\n" fi From 7d950698f153406f6b993d467216c6dae93f9080 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Mon, 16 Mar 2026 23:58:51 +0800 Subject: [PATCH 12/33] Update install.sh --- install.sh | 1328 +++++++++++++++++++--------------------------------- 1 file changed, 483 insertions(+), 845 deletions(-) diff --git a/install.sh b/install.sh index 4dad35e..cec8d78 100755 --- a/install.sh +++ b/install.sh @@ -1,904 +1,542 @@ -#!/usr/bin/env bash -# 严格模式 +#!/bin/bash set -euo pipefail -# --- DEBUG: 打印具体失败的行号和命令(systemd 下非常关键) --- -trap 'rc=$?; echo "[ERR] rc=$rc line=$LINENO cmd=$BASH_COMMAND" >&2' ERR -# 如需更详细:取消下一行注释 -# set -x -# --- DEBUG end --- +# ========================= +# 基础参数 +# ========================= +Server_Dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +Install_Dir="${CLASH_INSTALL_DIR:-$Server_Dir}" +Service_Name="clash-for-linux" +Service_User="root" +Service_Group="root" -############################################ -# Clash for Linux - start.sh (Full Version) -# - systemd 模式下订阅失败/下载失败:不退出,使用 conf/config.yaml(必要时从 conf/fallback_config.yaml 拷贝)兜底启动 -# - 非 systemd 模式:订阅失败/下载失败直接退出(保持手动执行的强约束) -############################################ +# ========================= +# 彩色输出(统一 printf + 自动降级 + 手动关色) +# ========================= -# 加载系统函数库(Only for RHEL Linux) -[ -f /etc/init.d/functions ] && source /etc/init.d/functions +# ---- 关色开关(优先级最高)---- +NO_COLOR_FLAG=0 +for arg in "$@"; do + case "$arg" in + --no-color|--nocolor) + NO_COLOR_FLAG=1 + ;; + esac +done -#################### 脚本初始化任务 #################### - -# 获取脚本工作目录绝对路径 -export Server_Dir -Server_Dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" - -# 加载.env变量文件 -# shellcheck disable=SC1090 -# --- source .env(不可信输入,必须放宽) --- -if [ -f "$Server_Dir/.env" ]; then - set +u - source "$Server_Dir/.env" || echo "[WARN] failed to source .env" >&2 - set -u +if [[ -n "${NO_COLOR:-}" ]] || [[ -n "${CLASH_NO_COLOR:-}" ]]; then + NO_COLOR_FLAG=1 fi -# systemd 模式开关(必须在 set -u 下安全) -SYSTEMD_MODE="${SYSTEMD_MODE:-false}" - -# root-only 强约束:不是 root 直接退出 -if [ "$(id -u)" -ne 0 ]; then - echo "[ERR] root-only mode: please run as root" >&2 - exit 2 +# ---- 初始化颜色 ---- +if [[ "$NO_COLOR_FLAG" -eq 0 ]] && [[ -t 1 ]] && command -v tput >/dev/null 2>&1; then + if tput setaf 1 >/dev/null 2>&1; then + C_RED="$(tput setaf 1)" + C_GREEN="$(tput setaf 2)" + C_YELLOW="$(tput setaf 3)" + C_BLUE="$(tput setaf 4)" + C_CYAN="$(tput setaf 6)" + C_GRAY="$(tput setaf 8 2>/dev/null || true)" + C_BOLD="$(tput bold)" + C_UL="$(tput smul)" + C_NC="$(tput sgr0)" + fi fi -# 给二进制启动程序、脚本等添加可执行权限 -chmod +x "$Server_Dir/bin/"* 2>/dev/null || true -chmod +x "$Server_Dir/scripts/"* 2>/dev/null || true -if [ -f "$Server_Dir/tools/subconverter/subconverter" ]; then - chmod +x "$Server_Dir/tools/subconverter/subconverter" 2>/dev/null || true +# ---- ANSI fallback ---- +if [[ "$NO_COLOR_FLAG" -eq 0 ]] && [[ -t 1 ]] && [[ -z "${C_NC:-}" ]]; then + C_RED=$'\033[31m' + C_GREEN=$'\033[32m' + C_YELLOW=$'\033[33m' + C_BLUE=$'\033[34m' + C_CYAN=$'\033[36m' + C_GRAY=$'\033[90m' + C_BOLD=$'\033[1m' + C_UL=$'\033[4m' + C_NC=$'\033[0m' fi -#################### 变量设置 #################### +# ---- 强制无色 ---- +if [[ "$NO_COLOR_FLAG" -eq 1 ]] || [[ ! -t 1 ]]; then + C_RED='' C_GREEN='' C_YELLOW='' C_BLUE='' C_CYAN='' C_GRAY='' C_BOLD='' C_UL='' C_NC='' +fi -Conf_Dir="$Server_Dir/conf" +# ========================= +# 基础输出函数 +# ========================= +log() { printf "%b\n" "$*"; } +info() { log "${C_CYAN}[INFO]${C_NC} $*"; } +ok() { log "${C_GREEN}[OK]${C_NC} $*"; } +warn() { log "${C_YELLOW}[WARN]${C_NC} $*"; } +err() { log "${C_RED}[ERROR]${C_NC} $*"; } -# root-only:统一使用安装目录下的 temp/logs -Temp_Dir="$Server_Dir/temp" -Log_Dir="$Server_Dir/logs" +# ========================= +# 样式助手 +# ========================= +path() { printf "%b" "${C_BOLD}$*${C_NC}"; } +cmd() { printf "%b" "${C_GRAY}$*${C_NC}"; } +url() { printf "%b" "${C_UL}$*${C_NC}"; } +good() { printf "%b" "${C_GREEN}$*${C_NC}"; } +bad() { printf "%b" "${C_RED}$*${C_NC}"; } -mkdir -p "$Conf_Dir" "$Temp_Dir" "$Log_Dir" || { - echo "[ERR] cannot create dirs: Conf_Dir=$Conf_Dir Temp_Dir=$Temp_Dir Log_Dir=$Log_Dir" - exit 2 +# ========================= +# 分段标题(CLI 风格 section) +# ========================= +section() { + local title="$*" + log "" + log "${C_BOLD}▶ ${title}${C_NC}" + log "${C_GRAY}────────────────────────────────────────${C_NC}" } -# 再做一次可写性检查,避免后面玄学 exit -touch "$Temp_Dir/.write_test" 2>/dev/null || { echo "[ERR] Temp_Dir not writable: $Temp_Dir"; exit 2; } -rm -f "$Temp_Dir/.write_test" 2>/dev/null || true +# ========================= +# 前置校验 +# ========================= +if [ "$(id -u)" -ne 0 ]; then + err "需要 root 权限执行安装脚本(请使用 sudo bash install.sh)" + exit 1 +fi -PID_FILE="${CLASH_PID_FILE:-$Temp_Dir/clash.pid}" +if [ ! -f "${Server_Dir}/.env" ]; then + err "未找到 .env 文件,请确认脚本所在目录:${Server_Dir}" + exit 1 +fi -is_running() { - if [ -f "$PID_FILE" ]; then - local pid - pid="$(cat "$PID_FILE" 2>/dev/null || true)" - if [ -n "${pid:-}" ] && kill -0 "$pid" 2>/dev/null; then - return 0 +# ========================= +# 同步到安装目录(保持你原逻辑) +# ========================= +mkdir -p "$Install_Dir" +if [ "$Server_Dir" != "$Install_Dir" ]; then + info "同步项目文件到安装目录:${Install_Dir}" + if command -v rsync >/dev/null 2>&1; then + rsync -a --delete --exclude '.git' "$Server_Dir/" "$Install_Dir/" + else + cp -a "$Server_Dir/." "$Install_Dir/" + fi +fi + +chmod +x "$Install_Dir"/*.sh 2>/dev/null || true +chmod +x "$Install_Dir"/scripts/* 2>/dev/null || true +chmod +x "$Install_Dir"/bin/* 2>/dev/null || true +chmod +x "$Install_Dir"/clashctl 2>/dev/null || true + +# ========================= +# 加载环境与依赖脚本 +# ========================= +# shellcheck disable=SC1090 +source "$Install_Dir/.env" +# shellcheck disable=SC1090 +source "$Install_Dir/scripts/get_cpu_arch.sh" +# shellcheck disable=SC1090 +source "$Install_Dir/scripts/resolve_clash.sh" +# shellcheck disable=SC1090 +source "$Install_Dir/scripts/port_utils.sh" + +if [[ -z "${CpuArch:-}" ]]; then + err "无法识别 CPU 架构" + exit 1 +fi + +# ========================= +# .env 写入工具:write_env_kv(必须在 prompt 之前定义) +# - 自动创建文件 +# - 存在则替换,不存在则追加 +# - 统一写成:export KEY="VALUE" +# - 自动转义双引号/反斜杠 +# ========================= +escape_env_value() { + printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g' +} + +write_env_kv() { + local file="$1" + local key="$2" + local val="$3" + + mkdir -p "$(dirname "$file")" 2>/dev/null || true + [ -f "$file" ] || touch "$file" + + val="$(printf '%s' "$val" | tr -d '\r')" + local esc + esc="$(escape_env_value "$val")" + + if grep -qE "^[[:space:]]*(export[[:space:]]+)?${key}=" "$file"; then + sed -i -E "s|^[[:space:]]*(export[[:space:]]+)?${key}=.*|export ${key}=\"${esc}\"|g" "$file" + else + printf 'export %s="%s"\n' "$key" "$esc" >> "$file" + fi +} + +# ========================= +# 交互式填写订阅地址(仅在 CLASH_URL 为空时触发) +# - 若非 TTY(CI/管道)则跳过交互 +# - 若用户回车跳过,则保持原行为:装完提示手动配置 +# ========================= +prompt_clash_url_if_empty() { + # 兼容 .env 里可能是 CLASH_URL= / export CLASH_URL= / 带引号 + local cur="${CLASH_URL:-}" + cur="${cur%\"}"; cur="${cur#\"}" + + if [ -n "$cur" ]; then + return 0 + fi + + # 非交互环境:不阻塞 + if [ ! -t 0 ]; then + warn "CLASH_URL 为空且当前为非交互环境(stdin 非 TTY),将跳过输入引导。" + return 0 + fi + + echo + warn "未检测到订阅地址(CLASH_URL 为空)" + echo "请粘贴你的 Clash 订阅地址(直接回车跳过,稍后手动编辑 .env):" + read -r -p "Clash URL: " input_url + + input_url="$(printf '%s' "$input_url" | tr -d '\r')" + + # 回车跳过:保持原行为(不写入) + if [ -z "$input_url" ]; then + warn "已跳过填写订阅地址,安装完成后请手动编辑:${Install_Dir}/.env" + return 0 + fi + + # 先校验再写入,避免污染 .env + if ! echo "$input_url" | grep -Eq '^https?://'; then + err "订阅地址格式不正确(必须以 http:// 或 https:// 开头)" + exit 1 + fi + + ENV_FILE="${Install_Dir}/.env" + mkdir -p "$Install_Dir" + [ -f "$ENV_FILE" ] || touch "$ENV_FILE" + + # ✅ 只用这一套写入逻辑(统一 export KEY="...",兼容旧格式) + write_env_kv "$ENV_FILE" "CLASH_URL" "$input_url" + + export CLASH_URL="$input_url" + ok "已写入订阅地址到:${ENV_FILE}" +} + +prompt_clash_url_if_empty + +# ========================= +# 端口冲突检测(保持你原逻辑) +# ========================= +CLASH_HTTP_PORT=${CLASH_HTTP_PORT:-7890} +CLASH_SOCKS_PORT=${CLASH_SOCKS_PORT:-7891} +CLASH_REDIR_PORT=${CLASH_REDIR_PORT:-7892} +EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-127.0.0.1:9090} + +parse_port() { + local raw="$1" + raw="${raw##*:}" + echo "$raw" +} + +Port_Conflicts=() +for port in "$CLASH_HTTP_PORT" "$CLASH_SOCKS_PORT" "$CLASH_REDIR_PORT" "$(parse_port "$EXTERNAL_CONTROLLER")"; do + if [ "$port" = "auto" ] || [ -z "$port" ]; then + continue + fi + if [[ "$port" =~ ^[0-9]+$ ]]; then + if is_port_in_use "$port"; then + Port_Conflicts+=("$port") fi fi +done + +if [ "${#Port_Conflicts[@]}" -ne 0 ]; then + warn "检测到端口冲突: ${Port_Conflicts[*]},运行时将自动分配可用端口" +fi + +install -d -m 0755 "$Install_Dir/conf" "$Install_Dir/logs" "$Install_Dir/temp" + +# ========================= +# Clash 内核就绪检查/下载 +# ========================= +if ! resolve_clash_bin "$Install_Dir" "$CpuArch" >/dev/null 2>&1; then + err "Clash 内核未就绪,请检查下载配置或手动放置二进制" + exit 1 +fi + +# ========================= +# fonction 工具函数区 +# ========================= +# 等待 config.yaml 出现并写入 secret(默认最多等 6 秒) +wait_secret_ready() { + local conf_file="$1" + local timeout_sec="${2:-6}" + + local end=$((SECONDS + timeout_sec)) + while [ "$SECONDS" -lt "$end" ]; do + if [ -s "$conf_file" ] && grep -qE '^[[:space:]]*secret:' "$conf_file"; then + return 0 + fi + sleep 0.2 + done return 1 } -if [ "${SYSTEMD_MODE:-false}" != "true" ] && is_running; then - echo -e "\n[OK] Clash 已在运行 (pid=$(cat "$PID_FILE")),跳过重复启动\n" - exit 0 -fi - -# systemd 模式下避免读取遗留 pid 干扰判断 -if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - rm -f "$PID_FILE" 2>/dev/null || true -fi - -# 统一订阅变量 -URL="${CLASH_URL:-}" - -# 清理可能的 CRLF(Windows 写 .env 很常见) -URL="$(printf '%s' "$URL" | tr -d '\r')" -URL="$(printf '%s' "$URL" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" - -#让 bash 子进程能拿到 -export CLASH_URL="$URL" - -# 只有在“需要在线更新订阅”的模式下才强制要求 URL -if [ -z "$URL" ] && [ "${SYSTEMD_MODE:-false}" != "true" ]; then - echo "[ERR] CLASH_URL 为空(未配置订阅地址)" - exit 2 -fi -if [ -n "$URL" ] && ! printf '%s' "$URL" | grep -Eq '^https?://'; then - echo "[ERR] CLASH_URL 格式无效:必须以 http:// 或 https:// 开头" >&2 - exit 2 -fi - -# 获取 CLASH_SECRET 值:优先 .env;其次读取旧 config;占位符视为无效;最后生成随机值 -Secret="${CLASH_SECRET:-}" - -# 尝试从旧 config.yaml 读取(仅当 .env 未提供) -if [ -z "$Secret" ] && [ -f "$Conf_Dir/config.yaml" ]; then - Secret="$(awk -F': *' '/^[[:space:]]*secret[[:space:]]*:/{print $2; exit}' "$Conf_Dir/config.yaml" 2>/dev/null | tr -d '"' || true)" -fi - -# 若读取到的是占位符(如 ${CLASH_SECRET}),视为无效 -if [[ "$Secret" =~ ^\$\{.*\}$ ]]; then - Secret="" -fi - -# 兜底生成随机 secret -if [ -z "$Secret" ]; then - if command -v openssl >/dev/null 2>&1; then - Secret="$(openssl rand -hex 32)" - else - # 32 bytes -> 64 hex chars - Secret="$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')" - fi -fi - -# 强制写入 secret 到指定配置文件(存在则替换,不存在则追加) -force_write_secret() { - local file="$1" - [ -f "$file" ] || return 0 - - if grep -qE '^[[:space:]]*secret:' "$file"; then - # 替换整行 secret(无论原来是啥,包括 SECRET_PLACEHOLDER / "${CLASH_SECRET}") - sed -i -E "s|^[[:space:]]*secret:.*$|secret: ${Secret}|g" "$file" - else - # 没有 secret 行就追加到文件末尾 - printf "\nsecret: %s\n" "$Secret" >> "$file" - fi +# 计算字符串可视宽度:中文大概率按 2 宽处理(简单够用版) +# 注:终端宽度/字体不统一时,中文宽度估算永远只能“近似” +vis_width() { + python3 - <<'PY' "$1" +import sys +s=sys.argv[1] +w=0 +for ch in s: + # East Asian Wide/FullWidth 近似当 2 + w += 2 if ord(ch) >= 0x2E80 else 1 +print(w) +PY } -ensure_ui_link() { - mkdir -p "$Conf_Dir" - ln -sfn "$Server_Dir/dashboard/public" "$Conf_Dir/ui" +pad_right() { # pad_right "text" width + local s="$1" w="$2" + local cur + cur="$(vis_width "$s")" + local pad=$(( w - cur )) + (( pad < 0 )) && pad=0 + printf "%s%*s" "$s" "$pad" "" } -# --- helpers: upsert yaml key (top-level), ensure UI links --- -upsert_yaml_kv() { - # Usage: upsert_yaml_kv - # Writes: key: value (top-level) - local file="$1" key="$2" value="$3" - [ -n "$file" ] && [ -n "$key" ] || return 1 - - # 如果文件不存在,先创建 - [ -f "$file" ] || : >"$file" || return 1 - - if grep -qE "^[[:space:]]*${key}:[[:space:]]*" "$file" 2>/dev/null; then - # 替换整行(避免残留引号) - sed -i -E "s|^[[:space:]]*${key}:[[:space:]]*.*$|${key}: ${value}|g" "$file" - else - # 追加前保证有换行 - tail -c 1 "$file" 2>/dev/null | read -r _last || true - # shellcheck disable=SC2034 - if [ "$(tail -c 1 "$file" 2>/dev/null || true)" != "" ]; then - printf "\n" >>"$file" - fi - printf "%s: %s\n" "$key" "$value" >>"$file" - fi +box_title() { # box_title "标题" width + local title="$1" width="$2" + local inner=$((width-2)) + printf "┌%s┐\n" "$(printf '─%.0s' $(seq 1 $inner))" + # 标题居中(近似) + local t=" $title " + local tw; tw="$(vis_width "$t")" + local left=$(( (inner - tw)/2 )); ((left<0)) && left=0 + local right=$(( inner - tw - left )); ((right<0)) && right=0 + printf "│%*s%s%*s│\n" "$left" "" "$t" "$right" "" + printf "├%s┤\n" "$(printf '─%.0s' $(seq 1 $inner))" } -ensure_ui_links() { - local ui_src="${UI_SRC_DIR:-$Server_Dir/dashboard/public}" - mkdir -p "$Conf_Dir" 2>/dev/null || true - if [ -d "$ui_src" ]; then - ln -sfn "$ui_src" "$Conf_Dir/ui" 2>/dev/null || true - fi +box_row() { # box_row "key" "value" width keyw + local k="$1" v="$2" width="$3" keyw="$4" + local inner=$((width-2)) + # 形如:│ key: value │ + local left="$(pad_right "$k" "$keyw")" + local line=" ${left} ${v}" + local lw; lw="$(vis_width "$line")" + local pad=$(( inner - lw )); ((pad<0)) && pad=0 + printf "│%s%*s│\n" "$line" "$pad" "" } -force_write_controller_and_ui() { - local file="$1" - local controller="${EXTERNAL_CONTROLLER:-127.0.0.1:9090}" - - [ -n "$file" ] || return 1 - - # external-controller - upsert_yaml_kv "$file" "external-controller" "$controller" || true - - # external-ui: fixed to Conf_Dir/ui - ensure_ui_links - if [ -e "$Conf_Dir/ui" ]; then - upsert_yaml_kv "$file" "external-ui" "$Conf_Dir/ui" || true - fi +box_end() { # box_end width + local width="$1" inner=$((width-2)) + printf "└%s┘\n" "$(printf '─%.0s' $(seq 1 $inner))" } +# 从 config.yaml 提取 secret(强韧:支持缩进/引号/CRLF/尾空格) +read_secret_from_config() { + local conf_file="$1" + [ -f "$conf_file" ] || return 1 -fix_external_ui_by_safe_paths() { - local bin="$1" - local cfg="$2" - local test_out="$3" - local ui_src="${UI_SRC_DIR:-$Server_Dir/dashboard/public}" + # 1) 找到 secret 行 -> 2) 去掉 key 和空格 -> 3) 去掉首尾引号 -> 4) 去掉 CR + local s + s="$( + sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' "$conf_file" \ + | head -n 1 \ + | sed -E 's/^[[:space:]]*"(.*)"[[:space:]]*$/\1/; s/^[[:space:]]*'\''(.*)'\''[[:space:]]*$/\1/' \ + | tr -d '\r' + )" - [ -x "$bin" ] || return 0 - [ -s "$cfg" ] || return 0 + # 去掉纯空格 + s="$(printf '%s' "$s" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" - # 先跑一次 test,把原因写入 test_out - "$bin" -t -f "$cfg" >"$test_out" 2>&1 - local rc=$? - [ $rc -eq 0 ] && return 0 - - # 只处理 external-ui 的 SAFE_PATH 报错 - if ! grep -q "SAFE_PATHS" "$test_out"; then - return $rc - fi - if ! grep -q "external-ui" "$cfg" && ! grep -q "external-ui" "$test_out"; then - return $rc - fi - - # 从 test_out 抽取 allowed paths 的第一个 base - # 例:allowed paths: [/opt/clash-for-linux/.config/mihomo] - local base - base="$(sed -n 's/.*allowed paths: \[\([^]]*\)\].*/\1/p' "$test_out" | head -n 1)" - - [ -n "$base" ] || return $rc - - # external-ui 必须在 allowed base 的子目录里 - local ui_dst="$base/ui" - mkdir -p "$ui_dst" 2>/dev/null || true - - # 把 UI 文件同步过去(真实目录,不用软链,避免跳出 base) - if [ -d "$ui_src" ]; then - if command -v rsync >/dev/null 2>&1; then - rsync -a --delete "$ui_src"/ "$ui_dst"/ 2>/dev/null || true - else - rm -rf "$ui_dst"/* 2>/dev/null || true - cp -a "$ui_src"/. "$ui_dst"/ 2>/dev/null || true - fi - fi - - # 重写 external-ui 到新目录 - upsert_yaml_kv "$cfg" "external-ui" "$ui_dst" || true - - # 再 test 一次 - "$bin" -t -f "$cfg" >"$test_out" 2>&1 - return $? + [ -n "$s" ] || return 1 + printf '%s' "$s" } -# 设置默认值 -CLASH_HTTP_PORT="${CLASH_HTTP_PORT:-7890}" -CLASH_SOCKS_PORT="${CLASH_SOCKS_PORT:-7891}" -CLASH_REDIR_PORT="${CLASH_REDIR_PORT:-7892}" -CLASH_LISTEN_IP="${CLASH_LISTEN_IP:-127.0.0.1}" -CLASH_ALLOW_LAN="${CLASH_ALLOW_LAN:-false}" +# ========================= +# systemd 安装与启动 +# ========================= +Service_Enabled="unknown" +Service_Started="unknown" -EXTERNAL_CONTROLLER_ENABLED="${EXTERNAL_CONTROLLER_ENABLED:-true}" -EXTERNAL_CONTROLLER="${EXTERNAL_CONTROLLER:-127.0.0.1:9090}" +if command -v systemctl >/dev/null 2>&1; then + CLASH_SERVICE_USER="$Service_User" CLASH_SERVICE_GROUP="$Service_Group" "$Install_Dir/scripts/install_systemd.sh" -ALLOW_INSECURE_TLS="${ALLOW_INSECURE_TLS:-false}" + if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ]; then + systemctl enable "${Service_Name}.service" >/dev/null 2>&1 || true + fi + if [ "${CLASH_START_SERVICE:-true}" = "true" ]; then + systemctl start "${Service_Name}.service" >/dev/null 2>&1 || true + fi -# 端口与配置工具 -# shellcheck disable=SC1090 -source "$Server_Dir/scripts/port_utils.sh" -CLASH_HTTP_PORT="$(resolve_port_value "HTTP" "$CLASH_HTTP_PORT")" -CLASH_SOCKS_PORT="$(resolve_port_value "SOCKS" "$CLASH_SOCKS_PORT")" -CLASH_REDIR_PORT="$(resolve_port_value "REDIR" "$CLASH_REDIR_PORT")" -EXTERNAL_CONTROLLER="$(resolve_host_port "External Controller" "$EXTERNAL_CONTROLLER" "127.0.0.1")" - -# shellcheck disable=SC1090 -source "$Server_Dir/scripts/config_utils.sh" - -#################### 函数定义 #################### - -# 自定义action函数,实现通用action功能(兼容 journald;关键错误会额外 echo 到 stderr) -success() { - echo -en "\033[60G[\033[1;32m OK \033[0;39m]\r" - return 0 -} - -failure() { - local rc=$? - echo -en "\033[60G[\033[1;31mFAILED\033[0;39m]\r" - [ -x /bin/plymouth ] && /bin/plymouth --details - return "$rc" -} - -action() { - local STRING - STRING=$1 - shift - - # 执行命令本身的成功/失败,不应让 UI 输出影响返回码 - if "$@"; then - success $"$STRING" || true - return 0 + if systemctl is-enabled --quiet "${Service_Name}.service" 2>/dev/null; then + Service_Enabled="enabled" else - failure $"$STRING" || true - return 1 - fi -} - -# 判断命令是否正常执行 -# - 手动模式:失败直接 exit -# - systemd 模式:只打印状态,不影响退出码 -if_success() { - local ok_msg=$1 - local fail_msg=$2 - local rc=$3 - - if [ "$rc" -eq 0 ]; then - action "$ok_msg" /bin/true || true - return 0 + Service_Enabled="disabled" fi - # rc != 0 - action "$fail_msg" /bin/false || true - - if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - # systemd 下不允许在 UI 函数中 exit - return "$rc" + if systemctl is-active --quiet "${Service_Name}.service" 2>/dev/null; then + Service_Started="active" else - exit "$rc" - fi -} - -ensure_subconverter() { - local bin="${Server_Dir}/tools/subconverter/subconverter" - local port="25500" - - # 没有二进制直接跳过 - if [ ! -x "$bin" ]; then - echo "[WARN] subconverter bin not found: $bin" - export SUBCONVERTER_READY="false" - return 0 - fi - - # 已在监听则认为就绪 - if ss -lntp 2>/dev/null | grep -qE ":${port}[[:space:]]"; then - export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://127.0.0.1:${port}}" - export SUBCONVERTER_READY="true" - return 0 - fi - - # 启动(后台) - echo "[INFO] starting subconverter..." - (cd "${Server_Dir}/tools/subconverter" && nohup "./subconverter" >/dev/null 2>&1 &) - - # 等待端口起来 - for _ in 1 2 3 4 5; do - sleep 1 - if ss -lntp 2>/dev/null | grep -qE ":${port}[[:space:]]"; then - export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://127.0.0.1:${port}}" - export SUBCONVERTER_READY="true" - echo "[OK] subconverter ready at ${SUBCONVERTER_URL}" - return 0 - fi - done - - echo "[WARN] subconverter start failed or port not ready" - export SUBCONVERTER_READY="false" - return 0 -} - -#################### 任务执行 #################### - -## 获取CPU架构信息 -# shellcheck disable=SC1090 -source "$Server_Dir/scripts/get_cpu_arch.sh" - -if [[ -z "${CpuArch:-}" ]]; then - echo "[ERROR] Failed to obtain CPU architecture" >&2 - exit 2 -fi - -# shellcheck disable=SC1090 -source "$Server_Dir/scripts/resolve_clash.sh" - -## 临时取消环境变量 -unset http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY || true - -######################################################## -# systemd 兜底:如果没有可用订阅 URL,则确保有 config.yaml -######################################################## -ensure_fallback_config() { - # conf/config.yaml 为空或不存在,则从 fallback 拷贝 - if [ ! -s "$Conf_Dir/config.yaml" ]; then - if [ -s "$Server_Dir/conf/fallback_config.yaml" ]; then - cp -f "$Server_Dir/conf/fallback_config.yaml" "$Conf_Dir/config.yaml" - echo -e "\033[33m[WARN]\033[0m 已复制 fallback_config.yaml -> conf/config.yaml(兜底)" - else - echo -e "\033[31m[ERROR]\033[0m 未找到可用的 conf/fallback_config.yaml,无法兜底启动" >&2 - if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - return 1 - else - exit 1 - fi - fi - fi - - # 强制写入真实 secret(失败时也遵循同样规则) - if ! force_write_secret "$Conf_Dir/config.yaml"; then - echo -e "\033[31m[ERROR]\033[0m 写入 secret 失败:$Conf_Dir/config.yaml" >&2 - if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - return 1 - else - exit 1 - fi - fi - - return 0 -} -SKIP_CONFIG_REBUILD=false - -# systemd 模式下若 URL 为空:直接兜底启动 -if [ "${SYSTEMD_MODE}" = "true" ] && [ -z "${URL:-}" ]; then - echo -e "\033[33m[WARN]\033[0m SYSTEMD_MODE=true 且 CLASH_URL 为空,跳过订阅更新,使用本地兜底配置启动" - ensure_fallback_config || true - SKIP_CONFIG_REBUILD=true -fi - -#################### Clash 订阅地址检测及配置文件下载 #################### -if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then - echo -e '\n正在检测订阅地址...' - Text1="Clash订阅地址可访问!" - Text2="Clash订阅地址不可访问!" - - CHECK_CMD=(curl -o /dev/null -L -sS --retry 5 -m 10 --connect-timeout 10 -w "%{http_code}") - if [ "$ALLOW_INSECURE_TLS" = "true" ]; then - CHECK_CMD+=(-k) - echo -e "\033[33m[WARN]\033[0m 已启用不安全的 TLS 下载(跳过证书校验)" - fi - if [ -n "${CLASH_HEADERS:-}" ]; then - CHECK_CMD+=(-H "$CLASH_HEADERS") - fi - CHECK_CMD+=("$URL") - - # 不让 set -e 干扰获取状态码 - set +e - status_code="$("${CHECK_CMD[@]}")" - curl_rc=$? - set -e - - # curl 本身失败,视为不可用 - if [ "$curl_rc" -ne 0 ]; then - status_code="" - ReturnStatus=1 - else - echo "$status_code" | grep -E '^[23][0-9]{2}$' &>/dev/null - ReturnStatus=$? - fi - - if [ "$ReturnStatus" -eq 0 ]; then - action "$Text1" /bin/true || true - else - if [ "$SYSTEMD_MODE" = "true" ]; then - action "$Text2(systemd 模式不退出,尝试使用旧配置/兜底配置)" /bin/false || true - echo -e "\033[33m[WARN]\033[0m Subscribe check failed: http_code=${status_code:-unknown}, url=${URL}" >&2 - ensure_fallback_config || true - SKIP_CONFIG_REBUILD=true - else - if_success "$Text1" "$Text2" "$ReturnStatus" - fi - fi -fi - -#################### 下载订阅并生成 config.yaml(非兜底路径) #################### -if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then - ensure_subconverter || true - echo -e '\n正在下载Clash配置文件...' - Text3="配置文件clash.yaml下载成功!" - Text4="配置文件clash.yaml下载失败!" - - # --- DBG: 显式打印并验证临时目录可写(systemd 下常见权限问题) --- - echo "[DBG] uid=$(id -u) user=$(id -un) SYSTEMD_MODE=${SYSTEMD_MODE:-}" - echo "[DBG] Server_Dir=$Server_Dir Conf_Dir=$Conf_Dir Temp_Dir=$Temp_Dir Log_Dir=$Log_Dir" - echo "[DBG] URL=$(printf '%q' "$URL")" - - mkdir -p "$Temp_Dir" 2>/dev/null || true - touch "$Temp_Dir/.write_test" 2>/dev/null || { echo "[ERR] Temp_Dir not writable: $Temp_Dir" >&2; exit 2; } - rm -f "$Temp_Dir/.write_test" 2>/dev/null || true - # --- DBG end --- - - CURL_CMD=(curl -fL -S --retry 2 --connect-timeout 10 -m 30 -o "$Temp_Dir/clash.yaml") - if [ "$ALLOW_INSECURE_TLS" = "true" ]; then - CURL_CMD+=(-k) - fi - if [ -n "${CLASH_HEADERS:-}" ]; then - CURL_CMD+=(-H "$CLASH_HEADERS") - fi - CURL_CMD+=("$URL") - - set +e - CURL_ERR="$Temp_Dir/curl.err" - : > "$CURL_ERR" - "${CURL_CMD[@]}" 2>>"$CURL_ERR" - ReturnStatus=$? - set -e - - echo "[DBG] curl rc=$ReturnStatus" - if [ -s "$CURL_ERR" ]; then - echo "[DBG] curl stderr (last 50 lines):" - tail -n 50 "$CURL_ERR" - fi - - if [ "$ReturnStatus" -ne 0 ]; then - WGET_CMD=(wget -q -O "$Temp_Dir/clash.yaml") - if [ "$ALLOW_INSECURE_TLS" = "true" ]; then - WGET_CMD+=(--no-check-certificate) - fi - if [ -n "${CLASH_HEADERS:-}" ]; then - WGET_CMD+=(--header="$CLASH_HEADERS") - fi - WGET_CMD+=("$URL") - - for _ in {1..10}; do - set +e - "${WGET_CMD[@]}" - ReturnStatus=$? - set -e - if [ "$ReturnStatus" -eq 0 ]; then - break - fi - done - fi - - CONFIG_FILE="${CONFIG_FILE:-$Temp_Dir/config.yaml}" - mkdir -p "$Temp_Dir" || true - - if [ "$ReturnStatus" -eq 0 ] && [ -s "$Temp_Dir/clash.yaml" ]; then - SRC_YAML="$Temp_Dir/clash.yaml" - - # 1) 判断是否是完整 Clash 配置(关键字段之一存在即可) - if grep -qE '^(proxies:|proxy-providers:|rules:|port:|mixed-port:|dns:)' "$SRC_YAML"; then - cp -f "$SRC_YAML" "$CONFIG_FILE" - echo "[INFO] subscription already is a full clash config" - else - # 2) 非完整配置:尝试用 subconverter 转换 - echo "[INFO] subscription is not a full config, try conversion via subconverter..." - - export IN_FILE="$SRC_YAML" - export OUT_FILE="$Temp_Dir/clash_converted.yaml" - - set +e - bash "$Server_Dir/scripts/clash_profile_conversion.sh" - conv_rc=$? - set -e - - if [ "$conv_rc" -eq 0 ] && [ -s "$OUT_FILE" ]; then - cp -f "$OUT_FILE" "$CONFIG_FILE" - echo "[INFO] conversion ok -> runtime config ready" - else - echo "[WARN] conversion skipped/failed, will keep original and rely on fallback" - cp -f "$SRC_YAML" "$CONFIG_FILE" - fi - fi - - # 3) 强制注入 external-controller / external-ui(运行态兜底) - force_write_controller_and_ui "$CONFIG_FILE" || true - - # 4) 强制注入 secret - force_write_secret "$CONFIG_FILE" || true - - # Optional: Fix test URLs to HTTPS for reliability (safe, narrow scope) - if [ "${FIX_TEST_URL_HTTPS:-true}" = "true" ] && [ -s "$CONFIG_FILE" ]; then - # 1) proxy-groups: url-test / fallback url - sed -i -E "s#(url:[[:space:]]*['\"])http://#\1https://#g" "$CONFIG_FILE" 2>/dev/null || true - - # 2) cfw-latency-url (some dashboards) - sed -i -E "s#(cfw-latency-url:[[:space:]]*['\"])http://#\1https://#g" "$CONFIG_FILE" 2>/dev/null || true - - # 3) proxy-providers health-check url (mihomo warns about this) - sed -i -E "s#(health-check:[[:space:]]*\n[[:space:]]*url:[[:space:]]*['\"])http://#\1https://#g" "$CONFIG_FILE" 2>/dev/null || true - fi - - # 5) 自检:失败则回退到旧配置(注意:脚本 set -e + trap ERR,必须 set +e 包裹) - BIN="${Server_Dir}/bin/clash-linux-amd64" - NEW_CFG="$CONFIG_FILE" - OLD_CFG="${Conf_Dir}/config.yaml" - TEST_OUT="$Temp_Dir/config.test.out" - - if [ -x "$BIN" ] && [ -f "$NEW_CFG" ]; then - # 先尝试自动修复 external-ui 的 SAFE_PATH 问题(内部会跑 -t) - set +e - fix_external_ui_by_safe_paths "$BIN" "$NEW_CFG" "$TEST_OUT" - test_rc=$? - set -e - - if [ "$test_rc" -ne 0 ]; then - echo "[ERROR] Generated config invalid, rc=$test_rc, reason(file=$TEST_OUT, size=$(wc -c <"$TEST_OUT" 2>/dev/null || echo 0))" >&2 - tail -n 120 "$TEST_OUT" >&2 || true - - echo "[ERROR] fallback to last good config: $OLD_CFG" >&2 - if [ -f "$OLD_CFG" ]; then - cp -f "$OLD_CFG" "$NEW_CFG" - else - echo "[FATAL] No valid config available, aborting startup" >&2 - exit 1 - fi - fi - fi - - echo "[INFO] Runtime config generated: $CONFIG_FILE (size=$(wc -c <"$CONFIG_FILE" 2>/dev/null || echo 0))" - else - echo "[WARN] Download did not produce clash.yaml (rc=$ReturnStatus), skip runtime config generation" >&2 - fi - - if [ "$ReturnStatus" -eq 0 ]; then - action "$Text3" /bin/true || true - else - if [ "$SYSTEMD_MODE" = "true" ]; then - action "$Text4(systemd 模式:下载失败,使用旧配置/兜底配置继续启动)" /bin/false || true - echo -e "\033[33m[WARN]\033[0m Download failed, will fallback. url=${URL}" >&2 - ensure_fallback_config || true - SKIP_CONFIG_REBUILD=true - else - if_success "$Text3" "$Text4(退出启动)" "$ReturnStatus" - fi - fi -fi - -# ========================================================= -# 判断订阅是否已是完整 Clash YAML(Meta / Mihomo / Premium) -# 若是完整配置,则直接使用,跳过后续代理拆解与拼接 -# ========================================================= -if grep -qE '^(proxies:|proxy-providers:|mixed-port:|port:)' "$Temp_Dir/clash.yaml"; then - echo "[INFO] subscription is a full Clash config, use it directly" - cp -f "$Temp_Dir/clash.yaml" "$Conf_Dir/config.yaml" - - # 生成运行态(systemd non-root 实际启动用 Temp_Dir/config.yaml) - cp -f "$Temp_Dir/clash.yaml" "$Temp_Dir/config.yaml" - - # 写 controller/ui + secret(写到运行态) - force_write_controller_and_ui "$Temp_Dir/config.yaml" || true - force_write_secret "$Temp_Dir/config.yaml" || true - - # 同时把 conf/config.yaml 也补齐(方便你 grep/排查) - force_write_controller_and_ui "$Conf_Dir/config.yaml" || true - force_write_secret "$Conf_Dir/config.yaml" || true - - # 创建 UI 软链(systemd non-root 用 /tmp) - Dashboard_Src="$Server_Dir/dashboard/public" - if [ -d "$Dashboard_Src" ]; then - ln -sfn "$Dashboard_Src" "$Conf_Dir/ui" 2>/dev/null || true - fi - - SKIP_CONFIG_REBUILD=true - fi - -#################### 订阅转换/拼接(非兜底路径) #################### -if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then - # 运行期配置文件:默认用 Temp_Dir(systemd + clash 用户可写) - CONFIG_FILE="$Temp_Dir/config.yaml" - - # 1) 重命名订阅文件 - \cp -a "$Temp_Dir/clash.yaml" "$Temp_Dir/clash_config.yaml" - - # 2) 判断订阅内容是否符合 clash 配置文件标准,尝试转换(需 subconverter) - # shellcheck disable=SC1090 - source "$Server_Dir/scripts/resolve_subconverter.sh" - - if [ "${Subconverter_Ready:-false}" = "true" ]; then - echo -e '\n判断订阅内容是否符合clash配置文件标准:' - export SUBCONVERTER_BIN="$Subconverter_Bin" - bash "$Server_Dir/scripts/clash_profile_conversion.sh" - sleep 1 - else - echo -e "\033[33m[WARN]\033[0m 未检测到可用的 subconverter,跳过订阅转换" - fi - - # 3) 订阅形态判断: - # - 如果已经是完整 Clash 配置(Meta/Mihomo 常见 mixed-port / proxy-providers 等),直接用它作为运行配置 - # - 否则才走 “proxies: 抽取 + template 拼接” - if grep -qE '^(mixed-port:|port:|proxy-providers:|proxies:)' "$Temp_Dir/clash_config.yaml"; then - # 情况 A:完整配置(优先) - if grep -q '^proxies:' "$Temp_Dir/clash_config.yaml" || grep -q '^proxy-providers:' "$Temp_Dir/clash_config.yaml" || grep -q '^mixed-port:' "$Temp_Dir/clash_config.yaml" || grep -q '^port:' "$Temp_Dir/clash_config.yaml"; then - echo "[INFO] subscription looks like a full Clash config, use it directly" - cp -f "$Temp_Dir/clash_config.yaml" "$CONFIG_FILE" - # 写入 secret(运行态) - force_write_secret "$CONFIG_FILE" - # 直接跳过后续拼接流程 - SKIP_CONFIG_REBUILD=true - fi - fi - - # 情况 B:不是完整配置,才尝试抽取 proxies 并拼接 - if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then - if grep -q '^proxies:' "$Temp_Dir/clash_config.yaml"; then - sed -n '/^proxies:/,$p' "$Temp_Dir/clash_config.yaml" > "$Temp_Dir/proxy.txt" - else - echo "[ERROR] subscription is not a full config and also has no 'proxies:'; cannot build config." >&2 - # systemd 模式:兜底继续;非 systemd:退出 - if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - ensure_fallback_config || true - SKIP_CONFIG_REBUILD=true - else - exit 2 - fi - fi - fi - - # 4) 合并形成新的 config,并替换配置占位符 - if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then - cat "$Temp_Dir/templete_config.yaml" > "$CONFIG_FILE" - cat "$Temp_Dir/proxy.txt" >> "$CONFIG_FILE" - - sed -i "s/CLASH_HTTP_PORT_PLACEHOLDER/${CLASH_HTTP_PORT}/g" "$CONFIG_FILE" - sed -i "s/CLASH_SOCKS_PORT_PLACEHOLDER/${CLASH_SOCKS_PORT}/g" "$CONFIG_FILE" - sed -i "s/CLASH_REDIR_PORT_PLACEHOLDER/${CLASH_REDIR_PORT}/g" "$CONFIG_FILE" - sed -i "s/CLASH_LISTEN_IP_PLACEHOLDER/${CLASH_LISTEN_IP}/g" "$CONFIG_FILE" - sed -i "s/CLASH_ALLOW_LAN_PLACEHOLDER/${CLASH_ALLOW_LAN}/g" "$CONFIG_FILE" - fi - - # 5) 配置 external-controller - if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then - sed -i "s/EXTERNAL_CONTROLLER_PLACEHOLDER/${EXTERNAL_CONTROLLER}/g" "$CONFIG_FILE" - else - sed -i "s/external-controller: 'EXTERNAL_CONTROLLER_PLACEHOLDER'/# external-controller: disabled/g" "$CONFIG_FILE" - fi - - apply_tun_config "$CONFIG_FILE" - apply_mixin_config "$CONFIG_FILE" "$Server_Dir" - - # 6) 是否同步到 conf(root/非 systemd 时才做;systemd+非root跳过) - \cp "$CONFIG_FILE" "$Conf_Dir/" - - # 7) Dashboard external-ui(systemd+非root:把 ui 放 Temp_Dir 下,避免写 conf) - Work_Dir="$(cd "$(dirname "$0")" && pwd)" - Dashboard_Src="${Work_Dir}/dashboard/public" - - if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then - if [ "${SYSTEMD_MODE:-false}" = "true" ] && [ "$(id -u)" -ne 0 ]; then - # runtime ui path (writable) - Dashboard_Link="$Temp_Dir/ui" - if [ -d "$Dashboard_Src" ]; then - ln -sfn "$Dashboard_Src" "$Dashboard_Link" 2>/dev/null || true - fi - else - # conf ui path (root can manage) - Dashboard_Link="${Conf_Dir}/ui" - if [ -d "$Dashboard_Src" ]; then - ln -sfn "$Dashboard_Src" "$Dashboard_Link" || true - else - echo -e "\033[33m[WARN]\033[0m Dashboard source not found: $Dashboard_Src (external-ui may not work)" - fi - fi - - # ensure external-ui points to Dashboard_Link - if grep -qE '^[[:space:]]*external-ui:' "$CONFIG_FILE"; then - sed -i -E "s|^[[:space:]]*external-ui:.*$|external-ui: ${Dashboard_Link}|g" "$CONFIG_FILE" - else - printf "\nexternal-ui: %s\n" "$Dashboard_Link" >> "$CONFIG_FILE" - fi - fi - - # 8) 写入 secret(写到 runtime config) - force_write_secret "$CONFIG_FILE" - -else - # 兜底路径:尽量也写入 secret(conf/config.yaml 可写时) - if grep -qE '^secret:\s*' "$Conf_Dir/config.yaml" 2>/dev/null; then - force_write_secret "$Conf_Dir/config.yaml" - else - echo "secret: ${Secret}" >> "$Conf_Dir/config.yaml" || true - fi -fi - -#################### 启动Clash服务 #################### - -# 选择运行期配置文件与工作目录 -CONFIG_FILE="${CONFIG_FILE:-$Conf_Dir/config.yaml}" -RUNTIME_DIR="${Conf_Dir}" - -# 启动前确保配置文件存在且非空 -if [ ! -s "$CONFIG_FILE" ]; then - echo -e "\033[31m[ERROR]\033[0m config 不存在或为空:$CONFIG_FILE,无法启动 Clash" >&2 - exit 2 -fi - -# 最终护栏:禁止未渲染的占位符进入运行态 -if grep -q '\${' "$CONFIG_FILE"; then - echo "[ERROR] config contains unresolved placeholders (\${...}): $CONFIG_FILE" >&2 - exit 2 -fi - -# 确保运行目录存在且可写(clash/mihomo 可能会写 cache/geo 数据) -mkdir -p "$RUNTIME_DIR" 2>/dev/null || true -touch "$RUNTIME_DIR/.write_test" 2>/dev/null || { - echo "[ERROR] runtime dir not writable: $RUNTIME_DIR (uid=$(id -u))" >&2 - exit 2 -} -rm -f "$RUNTIME_DIR/.write_test" 2>/dev/null || true - -echo -e '\n正在启动Clash服务...' -Text5="服务启动成功!" -Text6="服务启动失败!" - -Clash_Bin="$(resolve_clash_bin "$Server_Dir" "$CpuArch")" -ReturnStatus=$? - -if [ "$ReturnStatus" -eq 0 ]; then - if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - echo "[INFO] SYSTEMD_MODE=true,前台启动交给 systemd 监管" - echo "[INFO] Using config: $CONFIG_FILE" - echo "[INFO] Using runtime dir: $RUNTIME_DIR" - - # systemd 前台:只用 -f 指定配置文件,-d 作为工作目录 - exec "$Clash_Bin" -f "$CONFIG_FILE" -d "$RUNTIME_DIR" - else - echo "[INFO] 后台启动 (nohup)" - echo "[INFO] Using config: $CONFIG_FILE" - echo "[INFO] Using runtime dir: $RUNTIME_DIR" - - nohup "$Clash_Bin" -f "$CONFIG_FILE" -d "$RUNTIME_DIR" >>"$Log_Dir/clash.log" 2>&1 & - PID=$! - ReturnStatus=$? - - if [ "$ReturnStatus" -eq 0 ]; then - echo "$PID" > "$PID_FILE" - fi - fi -fi - -if [ "${SYSTEMD_MODE:-false}" = "true" ]; then - if_success "$Text5" "$Text6" "$ReturnStatus" || true -else - if_success "$Text5" "$Text6" "$ReturnStatus" -fi - -#################### 输出信息 #################### - -echo '' -if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then - echo -e "Clash Dashboard 访问地址: http://${EXTERNAL_CONTROLLER}/ui" - - SHOW_SECRET="${CLASH_SHOW_SECRET:-false}" - SHOW_SECRET_MASKED="${CLASH_SHOW_SECRET_MASKED:-true}" - - if [ "$SHOW_SECRET" = "true" ]; then - echo -e "Secret: ${Secret}" - elif [ "$SHOW_SECRET_MASKED" = "true" ]; then - # 脱敏:前4后4 - masked="${Secret:0:4}****${Secret: -4}" - echo -e "Secret: ${masked} (set CLASH_SHOW_SECRET=true to show full)" - else - echo -e "Secret: 已生成(未显示)。查看:/opt/clash-for-linux/conf/config.yaml 或 .env" + Service_Started="inactive" fi else - echo -e "External Controller (Dashboard) 已禁用" + warn "未检测到 systemd,已跳过服务单元生成" fi -echo '' -#################### 写入代理环境变量文件 #################### +# ========================= +# Shell 代理快捷命令 +# 生成:/etc/profile.d/clash-for-linux.sh +# ========================= +PROFILED_FILE="/etc/profile.d/clash-for-linux.sh" -Env_File="${CLASH_ENV_FILE:-}" +install_profiled() { + local http_port="${MIXED_PORT:-7890}" + # 兼容你后面可能支持 auto:auto 就先用 7890 + [ "$http_port" = "auto" ] && http_port="7890" -if [ "$Env_File" = "off" ] || [ "$Env_File" = "disabled" ]; then - echo -e "\033[33m[WARN]\033[0m 已关闭环境变量文件生成" -else - if [ -z "$Env_File" ]; then - if [ -w /etc/profile.d ]; then - Env_File="/etc/profile.d/clash-for-linux.sh" - else - Env_File="$Temp_Dir/clash-for-linux.sh" - fi - fi + # 只写 IPv4 loopback,避免某些环境 ::1 解析问题 + sudo tee "$PROFILED_FILE" >/dev/null <"$Env_File"<}" + echo "https_proxy=\${https_proxy:-}" + echo "all_proxy=\${all_proxy:-}" } EOF - echo -e "请执行以下命令加载环境变量: source ${Env_File}\n" - echo -e "请执行以下命令开启系统代理: proxy_on\n" - echo -e "若要临时关闭系统代理,请执行: proxy_off\n" + sudo chmod 644 "$PROFILED_FILE" +} + +install_profiled || true + +# ========================= +# 安装 clashctl 命令 +# ========================= +if [ -f "$Install_Dir/clashctl" ]; then + install -m 0755 "$Install_Dir/clashctl" /usr/local/bin/clashctl fi + +# ========================= +# 友好收尾输出(闭环) +# ========================= + +section "安装完成" +ok "Clash for Linux 已安装至: $(path "${Install_Dir}")" + +log "📦 安装目录:$(path "${Install_Dir}")" +log "👤 运行用户:${Service_User}:${Service_Group}" +log "🔧 服务名称:${Service_Name}.service" + +if command -v systemctl >/dev/null 2>&1; then + section "服务状态" + + se="${Service_Enabled:-unknown}" + ss="${Service_Started:-unknown}" + + [[ "$se" == "enabled" ]] && se_colored="$(good "$se")" || se_colored="$(bad "$se")" + [[ "$ss" == "active" ]] && ss_colored="$(good "$ss")" || ss_colored="$(bad "$ss")" + + log "🧷 开机自启:${se_colored}" + log "🟢 服务状态:${ss_colored}" + + log "" + log "${C_BOLD}常用命令:${C_NC}" + log " $(cmd "sudo systemctl status ${Service_Name}.service")" + log " $(cmd "sudo systemctl restart ${Service_Name}.service")" +fi + +# ========================= +# Dashboard / Secret +# ========================= +section "控制面板" + +api_port="$(parse_port "${EXTERNAL_CONTROLLER}")" +api_host="${EXTERNAL_CONTROLLER%:*}" + +if [[ -z "$api_host" ]] || [[ "$api_host" == "$EXTERNAL_CONTROLLER" ]]; then + api_host="127.0.0.1" +fi + +CONF_DIR="$Install_Dir/conf" +CONF_FILE="$CONF_DIR/config.yaml" + +SECRET_VAL="" +if wait_secret_ready "$CONF_FILE" 6; then + SECRET_VAL="$(read_secret_from_config "$CONF_FILE" || true)" +fi + +dash="http://${api_host}:${api_port}/ui" +log "🌐 Dashboard:$(url "$dash")" + +if [[ -n "$SECRET_VAL" ]]; then + MASKED="${SECRET_VAL}" + log "🔐 Secret:${C_YELLOW}${MASKED}${C_NC}" + log " 查看完整 Secret:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_FILE\" | head -n 1")" +else + log "🔐 Secret:${C_YELLOW}启动中暂未读到(稍后再试)${C_NC}" + log " 稍后查看:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_FILE\" | head -n 1")" +fi + +# ========================= +# 订阅配置(必须) +# ========================= +section "订阅状态" + +ENV_FILE="${Install_Dir}/.env" + +if [[ -n "${CLASH_URL:-}" ]]; then + ok "订阅地址已配置(CLASH_URL 已写入 .env)" +else + warn "订阅地址未配置(必须)" + log "" + log "配置订阅地址:" + log " $(cmd "sudo bash -c 'echo \"CLASH_URL=<订阅地址>\" > ${ENV_FILE}'")" + log "" + log "配置完成后重启服务:" + log " $(cmd "sudo systemctl restart ${Service_Name}.service")" +fi + +# ========================= +# 下一步 +# ========================= +section "下一步开启代理(可选)" + +PROFILED_FILE="/etc/profile.d/clash-for-linux.sh" + +if [ -f "$PROFILED_FILE" ]; then + log " $(cmd "source $PROFILED_FILE")" + log " $(cmd "proxy_on")" +else + log " (未安装 Shell 代理快捷命令,跳过)" +fi + +# ========================= +# 启动后快速诊断 +# ========================= +sleep 1 +if command -v journalctl >/dev/null 2>&1; then + if journalctl -u "${Service_Name}.service" -n 50 --no-pager 2>/dev/null \ + | grep -q "Clash订阅地址不可访问"; then + warn "服务启动异常:订阅不可用,请检查 CLASH_URL(可能过期 / 404 / 被墙)。" + fi +fi \ No newline at end of file From fa36c30b9f9775199bb190951e4aabb036d23217 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Mon, 16 Mar 2026 23:58:54 +0800 Subject: [PATCH 13/33] Update get_cpu_arch.sh --- scripts/get_cpu_arch.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/get_cpu_arch.sh b/scripts/get_cpu_arch.sh index 65d677f..737309b 100644 --- a/scripts/get_cpu_arch.sh +++ b/scripts/get_cpu_arch.sh @@ -47,4 +47,4 @@ else exitWithError "Unsupported Linux distribution" fi -echo "CPU architecture: $CpuArch" +info "CPU architecture: $CpuArch" From 573b11459f4f79b81335490a9dbfed0d698342dc Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Mon, 16 Mar 2026 23:58:56 +0800 Subject: [PATCH 14/33] Update start.sh --- start.sh | 51 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/start.sh b/start.sh index 9bd352d..59c0eb8 100644 --- a/start.sh +++ b/start.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # 严格模式 -set -eo pipefail +set -euo pipefail # --- DEBUG: 打印具体失败的行号和命令(systemd 下非常关键) --- trap 'rc=$?; echo "[ERR] rc=$rc line=$LINENO cmd=$BASH_COMMAND" >&2' ERR @@ -90,14 +90,37 @@ URL="${CLASH_URL:-}" URL="$(printf '%s' "$URL" | tr -d '\r')" URL="$(printf '%s' "$URL" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" +# 允许手动启动时交互填写;直接回车则切到本地兜底配置 +MANUAL_EMPTY_URL_FALLBACK=false +if [ -z "$URL" ] && [ "${SYSTEMD_MODE:-false}" != "true" ]; then + if [ -t 0 ]; then + echo + echo "[WARN] 未检测到订阅地址(CLASH_URL 为空)" + echo "请粘贴你的 Clash 订阅地址(直接回车将使用本地兜底配置启动):" + read -r -p "Clash URL: " input_url + input_url="$(printf '%s' "$input_url" | tr -d '\r')" + input_url="$(printf '%s' "$input_url" | sed -E 's/^[[:space:]]+//; s/[[:space:]]+$//')" + + if [ -n "$input_url" ]; then + if ! printf '%s' "$input_url" | grep -Eq '^https?://'; then + echo "[ERR] CLASH_URL 格式无效:必须以 http:// 或 https:// 开头" >&2 + exit 2 + fi + URL="$input_url" + export CLASH_URL="$URL" + else + echo "[WARN] 未填写订阅地址,切换为本地兜底配置启动" + MANUAL_EMPTY_URL_FALLBACK=true + fi + else + echo "[ERR] CLASH_URL 为空(未配置订阅地址)" >&2 + exit 2 + fi +fi + #让 bash 子进程能拿到 export CLASH_URL="$URL" -# 只有在“需要在线更新订阅”的模式下才强制要求 URL -if [ -z "$URL" ] && [ "${SYSTEMD_MODE:-false}" != "true" ]; then - echo "[ERR] CLASH_URL 为空(未配置订阅地址)" - exit 2 -fi if [ -n "$URL" ] && ! printf '%s' "$URL" | grep -Eq '^https?://'; then echo "[ERR] CLASH_URL 格式无效:必须以 http:// 或 https:// 开头" >&2 exit 2 @@ -179,7 +202,7 @@ ensure_ui_links() { force_write_controller_and_ui() { local file="$1" - local controller="${EXTERNAL_CONTROLLER:-127.0.0.1:9090}" + local controller="${EXTERNAL_CONTROLLER:-0.0.0.0:9090}" [ -n "$file" ] || return 1 @@ -249,11 +272,11 @@ fix_external_ui_by_safe_paths() { CLASH_HTTP_PORT="${CLASH_HTTP_PORT:-7890}" CLASH_SOCKS_PORT="${CLASH_SOCKS_PORT:-7891}" CLASH_REDIR_PORT="${CLASH_REDIR_PORT:-7892}" -CLASH_LISTEN_IP="${CLASH_LISTEN_IP:-127.0.0.1}" +CLASH_LISTEN_IP="${CLASH_LISTEN_IP:-0.0.0.0}" CLASH_ALLOW_LAN="${CLASH_ALLOW_LAN:-false}" EXTERNAL_CONTROLLER_ENABLED="${EXTERNAL_CONTROLLER_ENABLED:-true}" -EXTERNAL_CONTROLLER="${EXTERNAL_CONTROLLER:-127.0.0.1:9090}" +EXTERNAL_CONTROLLER="${EXTERNAL_CONTROLLER:-0.0.0.0:9090}" ALLOW_INSECURE_TLS="${ALLOW_INSECURE_TLS:-false}" @@ -410,9 +433,13 @@ ensure_fallback_config() { } SKIP_CONFIG_REBUILD=false -# systemd 模式下若 URL 为空:直接兜底启动 -if [ "${SYSTEMD_MODE}" = "true" ] && [ -z "${URL:-}" ]; then - echo -e "\033[33m[WARN]\033[0m SYSTEMD_MODE=true 且 CLASH_URL 为空,跳过订阅更新,使用本地兜底配置启动" +# systemd 模式下 URL 为空,或手动模式下用户回车跳过:直接兜底启动 +if { [ "${SYSTEMD_MODE}" = "true" ] && [ -z "${URL:-}" ]; } || [ "${MANUAL_EMPTY_URL_FALLBACK:-false}" = "true" ]; then + if [ "${SYSTEMD_MODE}" = "true" ]; then + echo -e "\033[33m[WARN]\033[0m SYSTEMD_MODE=true 且 CLASH_URL 为空,跳过订阅更新,使用本地兜底配置启动" + else + echo -e "\033[33m[WARN]\033[0m 手动模式未填写订阅地址,跳过订阅更新,使用本地兜底配置启动" + fi ensure_fallback_config || true SKIP_CONFIG_REBUILD=true fi From 5851833f5a5c5c686f3a0d56bcc3a03efa033857 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 00:04:32 +0800 Subject: [PATCH 15/33] Update uninstall.sh --- uninstall.sh | 204 +++++++++++++++++++++++++++------------------------ 1 file changed, 107 insertions(+), 97 deletions(-) diff --git a/uninstall.sh b/uninstall.sh index 117944f..2ae7030 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -1,142 +1,152 @@ #!/usr/bin/env bash set -euo pipefail -# ========================= -# 参数(对标 install.sh + install_systemd.sh) -# ========================= -Install_Dir="${CLASH_INSTALL_DIR:-/opt/clash-for-linux}" -Service_Name="clash-for-linux" -Service_User="root" -Service_Group="root" -Unit_Path="/etc/systemd/system/${Service_Name}.service" +# More accurate uninstall for clash-for-linux +SERVICE_NAME="clash-for-linux" +UNIT_PATH="/etc/systemd/system/${SERVICE_NAME}.service" -# ========================= -# 彩色输出 -# ========================= RED='\033[31m' GREEN='\033[32m' YELLOW='\033[33m' NC='\033[0m' - info() { echo -e "${GREEN}[INFO]${NC} $*"; } ok() { echo -e "${GREEN}[OK]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } err() { echo -e "${RED}[ERROR]${NC} $*"; } -# ========================= -# 前置校验 -# ========================= if [ "$(id -u)" -ne 0 ]; then err "需要 root 权限执行卸载脚本(请使用 sudo bash uninstall.sh)" exit 1 fi -info "开始卸载 ${Service_Name} ..." -info "Install_Dir=${Install_Dir}" +# Candidate install dirs: +# 1) explicit CLASH_INSTALL_DIR +# 2) working directory if it looks like clash-for-linux +# 3) service WorkingDirectory / ExecStart path inferred from unit +# 4) common defaults +candidates=() +[ -n "${CLASH_INSTALL_DIR:-}" ] && candidates+=("${CLASH_INSTALL_DIR}") +PWD_BASENAME="$(basename "${PWD}")" +if [ "$PWD_BASENAME" = "clash-for-linux" ] && [ -f "${PWD}/start.sh" ]; then + candidates+=("${PWD}") +fi -# ========================= -# 1) 优雅停止(优先 shutdown.sh,再 systemd) -# ========================= -if [ -f "${Install_Dir}/shutdown.sh" ]; then +if [ -f "$UNIT_PATH" ]; then + wd="$(sed -nE 's#^WorkingDirectory=(.*)#\1#p' "$UNIT_PATH" | head -n1 || true)" + [ -n "$wd" ] && candidates+=("$wd") + + exec_path="$(sed -nE 's#^ExecStart=/bin/bash[[:space:]]+([^[:space:]]+/start\.sh).*#\1#p' "$UNIT_PATH" | head -n1 || true)" + if [ -n "$exec_path" ]; then + candidates+=("$(dirname "$exec_path")") + fi +fi + +candidates+=("/root/clash-for-linux" "/opt/clash-for-linux") + +# normalize + uniq + choose first existing dir containing start.sh or shutdown.sh +INSTALL_DIR="" +declare -A seen +for d in "${candidates[@]}"; do + [ -n "$d" ] || continue + d="${d%/}" + [ -n "$d" ] || continue + if [ -z "${seen[$d]:-}" ]; then + seen[$d]=1 + if [ -d "$d" ] && { [ -f "$d/start.sh" ] || [ -f "$d/shutdown.sh" ] || [ -d "$d/conf" ]; }; then + INSTALL_DIR="$d" + break + fi + fi +done + +if [ -z "$INSTALL_DIR" ]; then + warn "未能自动识别安装目录,将按候选路径继续清理 systemd / 环境文件。" +else + info "识别到安装目录: $INSTALL_DIR" +fi + +info "开始卸载 ${SERVICE_NAME} ..." + +# 1) graceful stop +if [ -n "$INSTALL_DIR" ] && [ -f "${INSTALL_DIR}/shutdown.sh" ]; then info "执行 shutdown.sh(优雅停止)..." - bash "${Install_Dir}/shutdown.sh" >/dev/null 2>&1 || true + bash "${INSTALL_DIR}/shutdown.sh" >/dev/null 2>&1 || true fi if command -v systemctl >/dev/null 2>&1; then info "停止并禁用 systemd 服务..." - systemctl stop "${Service_Name}.service" >/dev/null 2>&1 || true - systemctl disable "${Service_Name}.service" >/dev/null 2>&1 || true + systemctl stop "${SERVICE_NAME}.service" >/dev/null 2>&1 || true + systemctl disable "${SERVICE_NAME}.service" >/dev/null 2>&1 || true fi -# ========================= -# 2) 兜底:按 PID 文件杀进程(对标 unit 的 PIDFile) -# ========================= -PID_FILE="${Install_Dir}/temp/clash.pid" -if [ -f "$PID_FILE" ]; then - PID="$(cat "$PID_FILE" 2>/dev/null || true)" - if [ -n "${PID:-}" ] && kill -0 "$PID" 2>/dev/null; then - info "检测到 PID=${PID},尝试停止..." - kill "$PID" 2>/dev/null || true - sleep 1 - if kill -0 "$PID" 2>/dev/null; then - warn "进程仍在运行,强制 kill -9 ${PID}" - kill -9 "$PID" 2>/dev/null || true +# 2) stop process by pid file from all likely dirs +for d in "/root/clash-for-linux" "/opt/clash-for-linux" "${INSTALL_DIR:-}"; do + [ -n "$d" ] || continue + PID_FILE="$d/temp/clash.pid" + if [ -f "$PID_FILE" ]; then + PID="$(cat "$PID_FILE" 2>/dev/null || true)" + if [ -n "${PID:-}" ] && kill -0 "$PID" 2>/dev/null; then + info "检测到 PID=${PID}(来自 $PID_FILE),尝试停止..." + kill "$PID" 2>/dev/null || true + sleep 1 + if kill -0 "$PID" 2>/dev/null; then + warn "进程仍在运行,强制 kill -9 ${PID}" + kill -9 "$PID" 2>/dev/null || true + fi fi - ok "已停止 clash 进程(PIDFile)" + rm -f "$PID_FILE" || true fi -fi +done -# 再兜底:按进程名(系统可能有多个 clash,不建议无脑 pkill -9;先提示再杀) -if pgrep -x clash >/dev/null 2>&1; then - warn "检测到仍有 clash 进程存在(可能非本项目),尝试温和结束..." - pkill -x clash >/dev/null 2>&1 || true - sleep 1 -fi -if pgrep -x clash >/dev/null 2>&1; then - warn "仍残留 clash 进程,执行 pkill -9(可能影响其它 clash 实例)..." - pkill -9 -x clash >/dev/null 2>&1 || true -fi +# 兜底:按完整路径匹配,避免误杀其他 clash +pkill -f '/clash-for-linux/.*/clash' >/dev/null 2>&1 || true +pkill -f '/clash-for-linux/.*/mihomo' >/dev/null 2>&1 || true +sleep 1 +pkill -9 -f '/clash-for-linux/.*/clash' >/dev/null 2>&1 || true +pkill -9 -f '/clash-for-linux/.*/mihomo' >/dev/null 2>&1 || true -# ========================= -# 3) 删除 systemd unit(对标 install_systemd.sh) -# ========================= -if [ -f "$Unit_Path" ]; then - rm -f "$Unit_Path" - ok "已移除 systemd 单元: ${Unit_Path}" +# 3) remove unit and related files +if [ -f "$UNIT_PATH" ]; then + rm -f "$UNIT_PATH" + ok "已移除 systemd 单元: ${UNIT_PATH}" fi - -# drop-in(万一用户自定义过) -if [ -d "/etc/systemd/system/${Service_Name}.service.d" ]; then - rm -rf "/etc/systemd/system/${Service_Name}.service.d" - ok "已移除 drop-in: /etc/systemd/system/${Service_Name}.service.d" +if [ -d "/etc/systemd/system/${SERVICE_NAME}.service.d" ]; then + rm -rf "/etc/systemd/system/${SERVICE_NAME}.service.d" + ok "已移除 drop-in: /etc/systemd/system/${SERVICE_NAME}.service.d" fi - if command -v systemctl >/dev/null 2>&1; then systemctl daemon-reload >/dev/null 2>&1 || true systemctl reset-failed >/dev/null 2>&1 || true fi -# ========================= -# 4) 清理默认配置/环境脚本/命令入口 -# ========================= -if [ -f "/etc/default/${Service_Name}" ]; then - rm -f "/etc/default/${Service_Name}" - ok "已移除: /etc/default/${Service_Name}" +# 4) cleanup env / command entry +rm -f "/etc/default/${SERVICE_NAME}" >/dev/null 2>&1 || true +rm -f "/etc/profile.d/clash-for-linux.sh" >/dev/null 2>&1 || true +rm -f "/usr/local/bin/clashctl" >/dev/null 2>&1 || true +for d in "/root/clash-for-linux" "/opt/clash-for-linux" "${INSTALL_DIR:-}"; do + [ -n "$d" ] || continue + rm -f "$d/temp/clash-for-linux.sh" >/dev/null 2>&1 || true +done + +# 5) remove install dirs +removed_any=false +for d in "${INSTALL_DIR:-}" "/root/clash-for-linux" "/opt/clash-for-linux"; do + [ -n "$d" ] || continue + if [ -d "$d" ] && { [ -f "$d/start.sh" ] || [ -d "$d/conf" ] || [ "$d" = "$INSTALL_DIR" ]; }; then + rm -rf "$d" + ok "已移除安装目录: $d" + removed_any=true + fi +done + +if [ "$removed_any" = false ]; then + warn "未发现可删除的安装目录" fi -# 运行时 Env_File 可能写到 /etc/profile.d 或 temp,这里都清 -if [ -f "/etc/profile.d/clash-for-linux.sh" ]; then - rm -f "/etc/profile.d/clash-for-linux.sh" - ok "已移除: /etc/profile.d/clash-for-linux.sh" -fi - -if [ -f "${Install_Dir}/temp/clash-for-linux.sh" ]; then - rm -f "${Install_Dir}/temp/clash-for-linux.sh" || true - ok "已移除: ${Install_Dir}/temp/clash-for-linux.sh" -fi - -if [ -f "/usr/local/bin/clashctl" ]; then - rm -f "/usr/local/bin/clashctl" - ok "已移除: /usr/local/bin/clashctl" -fi - -# ========================= -# 5) 删除安装目录 -# ========================= -if [ -d "$Install_Dir" ]; then - rm -rf "$Install_Dir" - ok "已移除安装目录: ${Install_Dir}" -else - warn "未找到安装目录: ${Install_Dir}" -fi - -# ========================= -# 7) 提示:当前终端代理变量需要手动清 -# ========================= echo warn "如果你曾执行 proxy_on,当前终端可能仍保留代理环境变量。可执行:" echo " unset http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY" echo " # 或关闭终端重新打开" echo -ok "卸载完成(root-only 模式)✅" +ok "卸载完成 ✅" From f03e75166e880a6e424e2774a53db44d7c4fe1b1 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 00:20:13 +0800 Subject: [PATCH 16/33] Update install.sh --- install.sh | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/install.sh b/install.sh index cec8d78..d29cce2 100755 --- a/install.sh +++ b/install.sh @@ -478,23 +478,37 @@ if [[ -z "$api_host" ]] || [[ "$api_host" == "$EXTERNAL_CONTROLLER" ]]; then fi CONF_DIR="$Install_Dir/conf" -CONF_FILE="$CONF_DIR/config.yaml" +TEMP_DIR="$Install_Dir/temp" SECRET_VAL="" -if wait_secret_ready "$CONF_FILE" 6; then - SECRET_VAL="$(read_secret_from_config "$CONF_FILE" || true)" -fi +SECRET_FILE="" + +for f in \ + "$TEMP_DIR/config.yaml" \ + "$CONF_DIR/config.yaml" +do + if wait_secret_ready "$f" 12; then + SECRET_VAL="$(read_secret_from_config "$f" || true)" + if [[ -n "$SECRET_VAL" ]]; then + SECRET_FILE="$f" + break + fi + fi +done dash="http://${api_host}:${api_port}/ui" log "🌐 Dashboard:$(url "$dash")" +SHOW_FILE="${SECRET_FILE:-$CONF_DIR/config.yaml}" + if [[ -n "$SECRET_VAL" ]]; then - MASKED="${SECRET_VAL}" + MASKED="${SECRET_VAL:0:4}****${SECRET_VAL: -4}" log "🔐 Secret:${C_YELLOW}${MASKED}${C_NC}" - log " 查看完整 Secret:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_FILE\" | head -n 1")" + log " 查看完整 Secret:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$SHOW_FILE\" | head -n 1")" else log "🔐 Secret:${C_YELLOW}启动中暂未读到(稍后再试)${C_NC}" - log " 稍后查看:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_FILE\" | head -n 1")" + log " 稍后查看:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_DIR/config.yaml\" | head -n 1")" + log " 也可检查运行态:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$TEMP_DIR/config.yaml\" | head -n 1")" fi # ========================= From f168016972adb0b0e2cb1566fe1cf34c166fb695 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 00:27:45 +0800 Subject: [PATCH 17/33] Update start.sh --- start.sh | 45 ++++++++++++++++++++------------------------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/start.sh b/start.sh index 59c0eb8..f34511c 100644 --- a/start.sh +++ b/start.sh @@ -824,12 +824,30 @@ Clash_Bin="$(resolve_clash_bin "$Server_Dir" "$CpuArch")" ReturnStatus=$? if [ "$ReturnStatus" -eq 0 ]; then + echo '' + if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then + echo -e "Clash Dashboard 访问地址: http://${EXTERNAL_CONTROLLER}/ui" + + SHOW_SECRET="${CLASH_SHOW_SECRET:-false}" + SHOW_SECRET_MASKED="${CLASH_SHOW_SECRET_MASKED:-true}" + + if [ "$SHOW_SECRET" = "true" ]; then + echo -e "Secret: ${Secret}" + elif [ "$SHOW_SECRET_MASKED" = "true" ]; then + masked="${Secret:0:4}****${Secret: -4}" + echo -e "Secret: ${masked} (set CLASH_SHOW_SECRET=true to show full)" + else + echo -e "Secret: 已生成(未显示)。查看:${CONFIG_FILE} 或 .env" + fi + else + echo -e "External Controller (Dashboard) 已禁用" + fi + echo '' + if [ "${SYSTEMD_MODE:-false}" = "true" ]; then echo "[INFO] SYSTEMD_MODE=true,前台启动交给 systemd 监管" echo "[INFO] Using config: $CONFIG_FILE" echo "[INFO] Using runtime dir: $RUNTIME_DIR" - - # systemd 前台:只用 -f 指定配置文件,-d 作为工作目录 exec "$Clash_Bin" -f "$CONFIG_FILE" -d "$RUNTIME_DIR" else echo "[INFO] 后台启动 (nohup)" @@ -852,29 +870,6 @@ else if_success "$Text5" "$Text6" "$ReturnStatus" fi -#################### 输出信息 #################### - -echo '' -if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then - echo -e "Clash Dashboard 访问地址: http://${EXTERNAL_CONTROLLER}/ui" - - SHOW_SECRET="${CLASH_SHOW_SECRET:-false}" - SHOW_SECRET_MASKED="${CLASH_SHOW_SECRET_MASKED:-true}" - - if [ "$SHOW_SECRET" = "true" ]; then - echo -e "Secret: ${Secret}" - elif [ "$SHOW_SECRET_MASKED" = "true" ]; then - # 脱敏:前4后4 - masked="${Secret:0:4}****${Secret: -4}" - echo -e "Secret: ${masked} (set CLASH_SHOW_SECRET=true to show full)" - else - echo -e "Secret: 已生成(未显示)。查看:/opt/clash-for-linux/conf/config.yaml 或 .env" - fi -else - echo -e "External Controller (Dashboard) 已禁用" -fi -echo '' - #################### 写入代理环境变量文件 #################### Env_File="${CLASH_ENV_FILE:-}" From a1c2b9affe828d9990e346eb2f237410863282d4 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 00:27:47 +0800 Subject: [PATCH 18/33] Update uninstall.sh --- uninstall.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/uninstall.sh b/uninstall.sh index 2ae7030..414812d 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -129,19 +129,19 @@ for d in "/root/clash-for-linux" "/opt/clash-for-linux" "${INSTALL_DIR:-}"; do done # 5) remove install dirs -removed_any=false -for d in "${INSTALL_DIR:-}" "/root/clash-for-linux" "/opt/clash-for-linux"; do - [ -n "$d" ] || continue - if [ -d "$d" ] && { [ -f "$d/start.sh" ] || [ -d "$d/conf" ] || [ "$d" = "$INSTALL_DIR" ]; }; then - rm -rf "$d" - ok "已移除安装目录: $d" - removed_any=true - fi -done +# removed_any=false +# for d in "${INSTALL_DIR:-}" "/root/clash-for-linux" "/opt/clash-for-linux"; do +# [ -n "$d" ] || continue +# if [ -d "$d" ] && { [ -f "$d/start.sh" ] || [ -d "$d/conf" ] || [ "$d" = "$INSTALL_DIR" ]; }; then +# rm -rf "$d" +# ok "已移除安装目录: $d" +# removed_any=true +# fi +# done -if [ "$removed_any" = false ]; then - warn "未发现可删除的安装目录" -fi +# if [ "$removed_any" = false ]; then +# warn "未发现可删除的安装目录" +# fi echo warn "如果你曾执行 proxy_on,当前终端可能仍保留代理环境变量。可执行:" From 2255f065be1692f071d4bfd060e99aa278dc248f Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:06:13 +0800 Subject: [PATCH 19/33] Update install.sh --- install.sh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/install.sh b/install.sh index d29cce2..1bc0788 100755 --- a/install.sh +++ b/install.sh @@ -225,7 +225,7 @@ prompt_clash_url_if_empty CLASH_HTTP_PORT=${CLASH_HTTP_PORT:-7890} CLASH_SOCKS_PORT=${CLASH_SOCKS_PORT:-7891} CLASH_REDIR_PORT=${CLASH_REDIR_PORT:-7892} -EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-127.0.0.1:9090} +EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-0.0.0.0:9090} parse_port() { local raw="$1" @@ -360,10 +360,10 @@ if command -v systemctl >/dev/null 2>&1; then CLASH_SERVICE_USER="$Service_User" CLASH_SERVICE_GROUP="$Service_Group" "$Install_Dir/scripts/install_systemd.sh" if [ "${CLASH_ENABLE_SERVICE:-true}" = "true" ]; then - systemctl enable "${Service_Name}.service" >/dev/null 2>&1 || true + systemctl start "${Service_Name}.service" || true fi if [ "${CLASH_START_SERVICE:-true}" = "true" ]; then - systemctl start "${Service_Name}.service" >/dev/null 2>&1 || true + systemctl start "${Service_Name}.service" || true fi if systemctl is-enabled --quiet "${Service_Name}.service" 2>/dev/null; then @@ -487,12 +487,10 @@ for f in \ "$TEMP_DIR/config.yaml" \ "$CONF_DIR/config.yaml" do - if wait_secret_ready "$f" 12; then - SECRET_VAL="$(read_secret_from_config "$f" || true)" - if [[ -n "$SECRET_VAL" ]]; then - SECRET_FILE="$f" - break - fi + SECRET_VAL="$(read_secret_from_config "$f" 2>/dev/null || true)" + if [[ -n "$SECRET_VAL" ]]; then + SECRET_FILE="$f" + break fi done From e21f7428b5c1225f8413f6e560b55f23285af578 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:06:15 +0800 Subject: [PATCH 20/33] Update get_cpu_arch.sh --- scripts/get_cpu_arch.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/get_cpu_arch.sh b/scripts/get_cpu_arch.sh index 737309b..a9a98e2 100644 --- a/scripts/get_cpu_arch.sh +++ b/scripts/get_cpu_arch.sh @@ -47,4 +47,5 @@ else exitWithError "Unsupported Linux distribution" fi -info "CPU architecture: $CpuArch" +log_info() { echo "[INFO] $*"; } +log_info "CPU architecture: $CpuArch" \ No newline at end of file From f8a35b7bc433d03df8e4f413b84e38e3de05d8c6 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:06:17 +0800 Subject: [PATCH 21/33] Update install_systemd.sh --- scripts/install_systemd.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/install_systemd.sh b/scripts/install_systemd.sh index b581131..132e486 100755 --- a/scripts/install_systemd.sh +++ b/scripts/install_systemd.sh @@ -35,6 +35,8 @@ Description=Clash for Linux (Mihomo) Documentation=https://github.com/wnlen/clash-for-linux After=network-online.target nss-lookup.target Wants=network-online.target +StartLimitIntervalSec=0 +StartLimitBurst=10 [Service] Type=simple @@ -55,7 +57,6 @@ ExecReload=/bin/kill -HUP \$MAINPID # 常驻策略:即使上层脚本正常退出,也要由 systemd 拉回 Restart=always RestartSec=5s -StartLimitIntervalSec=0 # 停止与日志 KillMode=mixed From 50f0eec55cf475c17b4681e389197458f5e3d841 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:20:31 +0800 Subject: [PATCH 22/33] Update install.sh --- install.sh | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/install.sh b/install.sh index 1bc0788..83ffa39 100755 --- a/install.sh +++ b/install.sh @@ -483,15 +483,18 @@ TEMP_DIR="$Install_Dir/temp" SECRET_VAL="" SECRET_FILE="" -for f in \ - "$TEMP_DIR/config.yaml" \ - "$CONF_DIR/config.yaml" -do - SECRET_VAL="$(read_secret_from_config "$f" 2>/dev/null || true)" - if [[ -n "$SECRET_VAL" ]]; then - SECRET_FILE="$f" - break - fi +for _ in {1..15}; do + for f in \ + "$TEMP_DIR/config.yaml" \ + "$CONF_DIR/config.yaml" + do + SECRET_VAL="$(read_secret_from_config "$f" 2>/dev/null || true)" + if [[ -n "$SECRET_VAL" ]]; then + SECRET_FILE="$f" + break 2 + fi + done + sleep 0.2 done dash="http://${api_host}:${api_port}/ui" @@ -500,9 +503,9 @@ log "🌐 Dashboard:$(url "$dash")" SHOW_FILE="${SECRET_FILE:-$CONF_DIR/config.yaml}" if [[ -n "$SECRET_VAL" ]]; then - MASKED="${SECRET_VAL:0:4}****${SECRET_VAL: -4}" + MASKED="${SECRET_VAL}" log "🔐 Secret:${C_YELLOW}${MASKED}${C_NC}" - log " 查看完整 Secret:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$SHOW_FILE\" | head -n 1")" + # log " 查看完整 Secret:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$SHOW_FILE\" | head -n 1")" else log "🔐 Secret:${C_YELLOW}启动中暂未读到(稍后再试)${C_NC}" log " 稍后查看:$(cmd "sudo sed -nE 's/^[[:space:]]*secret:[[:space:]]*//p' \"$CONF_DIR/config.yaml\" | head -n 1")" From ba8f43feb38cdab84012987e9b0d057ac90d8220 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:40:33 +0800 Subject: [PATCH 23/33] Update .env --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index 90a360d..ba52ac7 100644 --- a/.env +++ b/.env @@ -42,7 +42,7 @@ CLASH_SHOW_SECRET_MASKED=true # - 默认仅监听本机:127.0.0.1:9090 (推荐) # - 如需局域网访问再改成:0.0.0.0:9090,并确保 CLASH_SECRET 足够复杂 export EXTERNAL_CONTROLLER_ENABLED=true -export EXTERNAL_CONTROLLER='127.0.0.1:9090' +export EXTERNAL_CONTROLLER='0.0.0.0:9090' # ------------------------- # 3) 代理端口与监听(常用) From f41cd5844839545a9be5205d2c1407d0637bcb60 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:40:36 +0800 Subject: [PATCH 24/33] Update install.sh --- install.sh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/install.sh b/install.sh index 83ffa39..42de59b 100755 --- a/install.sh +++ b/install.sh @@ -225,7 +225,7 @@ prompt_clash_url_if_empty CLASH_HTTP_PORT=${CLASH_HTTP_PORT:-7890} CLASH_SOCKS_PORT=${CLASH_SOCKS_PORT:-7891} CLASH_REDIR_PORT=${CLASH_REDIR_PORT:-7892} -EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-0.0.0.0:9090} +EXTERNAL_CONTROLLER=${EXTERNAL_CONTROLLER:-127.0.0.1:9090} parse_port() { local raw="$1" @@ -473,10 +473,32 @@ section "控制面板" api_port="$(parse_port "${EXTERNAL_CONTROLLER}")" api_host="${EXTERNAL_CONTROLLER%:*}" +get_public_ip() { + if command -v curl >/dev/null 2>&1; then + curl -4 -fsS --max-time 3 https://api.ipify.org 2>/dev/null \ + || curl -4 -fsS --max-time 3 https://ifconfig.me 2>/dev/null \ + || curl -4 -fsS --max-time 3 https://ipv4.icanhazip.com 2>/dev/null \ + || true + elif command -v wget >/dev/null 2>&1; then + wget -qO- --timeout=3 https://api.ipify.org 2>/dev/null \ + || wget -qO- --timeout=3 https://ifconfig.me 2>/dev/null \ + || wget -qO- --timeout=3 https://ipv4.icanhazip.com 2>/dev/null \ + || true + else + true + fi +} + if [[ -z "$api_host" ]] || [[ "$api_host" == "$EXTERNAL_CONTROLLER" ]]; then api_host="127.0.0.1" fi +if [[ "$api_host" == "0.0.0.0" ]] || [[ "$api_host" == "::" ]] || [[ "$api_host" == "localhost" ]]; then + api_host="$(get_public_ip | tr -d '\r\n')" + [[ -z "$api_host" ]] && api_host="$(hostname -I 2>/dev/null | awk '{print $1}')" + [[ -z "$api_host" ]] && api_host="127.0.0.1" +fi + CONF_DIR="$Install_Dir/conf" TEMP_DIR="$Install_Dir/temp" From b7d42c8b0e9b3e9527b22c11c1ae03526fbac935 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:40:39 +0800 Subject: [PATCH 25/33] Update start.sh --- start.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/start.sh b/start.sh index f34511c..7b702cb 100644 --- a/start.sh +++ b/start.sh @@ -349,6 +349,10 @@ ensure_subconverter() { local bin="${Server_Dir}/tools/subconverter/subconverter" local port="25500" + # 自动获取服务器IP + local host_ip + host_ip="$(hostname -I | awk '{print $1}')" + # 没有二进制直接跳过 if [ ! -x "$bin" ]; then echo "[WARN] subconverter bin not found: $bin" @@ -358,20 +362,20 @@ ensure_subconverter() { # 已在监听则认为就绪 if ss -lntp 2>/dev/null | grep -qE ":${port}[[:space:]]"; then - export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://127.0.0.1:${port}}" + export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://${host_ip}:${port}}" export SUBCONVERTER_READY="true" return 0 fi - # 启动(后台) + # 启动(监听所有IP) echo "[INFO] starting subconverter..." - (cd "${Server_Dir}/tools/subconverter" && nohup "./subconverter" >/dev/null 2>&1 &) + (cd "${Server_Dir}/tools/subconverter" && nohup "./subconverter" -listen 0.0.0.0:${port} >/dev/null 2>&1 &) # 等待端口起来 for _ in 1 2 3 4 5; do sleep 1 if ss -lntp 2>/dev/null | grep -qE ":${port}[[:space:]]"; then - export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://127.0.0.1:${port}}" + export SUBCONVERTER_URL="${SUBCONVERTER_URL:-http://${host_ip}:${port}}" export SUBCONVERTER_READY="true" echo "[OK] subconverter ready at ${SUBCONVERTER_URL}" return 0 From a61a10688202b5e6ef9ba9d1c07cfb6dcc8ca63a Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:41:46 +0800 Subject: [PATCH 26/33] Update uninstall.sh --- uninstall.sh | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/uninstall.sh b/uninstall.sh index 414812d..2ae7030 100755 --- a/uninstall.sh +++ b/uninstall.sh @@ -129,19 +129,19 @@ for d in "/root/clash-for-linux" "/opt/clash-for-linux" "${INSTALL_DIR:-}"; do done # 5) remove install dirs -# removed_any=false -# for d in "${INSTALL_DIR:-}" "/root/clash-for-linux" "/opt/clash-for-linux"; do -# [ -n "$d" ] || continue -# if [ -d "$d" ] && { [ -f "$d/start.sh" ] || [ -d "$d/conf" ] || [ "$d" = "$INSTALL_DIR" ]; }; then -# rm -rf "$d" -# ok "已移除安装目录: $d" -# removed_any=true -# fi -# done +removed_any=false +for d in "${INSTALL_DIR:-}" "/root/clash-for-linux" "/opt/clash-for-linux"; do + [ -n "$d" ] || continue + if [ -d "$d" ] && { [ -f "$d/start.sh" ] || [ -d "$d/conf" ] || [ "$d" = "$INSTALL_DIR" ]; }; then + rm -rf "$d" + ok "已移除安装目录: $d" + removed_any=true + fi +done -# if [ "$removed_any" = false ]; then -# warn "未发现可删除的安装目录" -# fi +if [ "$removed_any" = false ]; then + warn "未发现可删除的安装目录" +fi echo warn "如果你曾执行 proxy_on,当前终端可能仍保留代理环境变量。可执行:" From 894e3801054363583a9d20a628664077c258bed8 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:47:22 +0800 Subject: [PATCH 27/33] Update start.sh --- start.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/start.sh b/start.sh index 7b702cb..f2be2b1 100644 --- a/start.sh +++ b/start.sh @@ -142,10 +142,10 @@ fi # 兜底生成随机 secret if [ -z "$Secret" ]; then if command -v openssl >/dev/null 2>&1; then - Secret="$(openssl rand -hex 32)" + Secret="$(openssl rand -hex 16)" else # 32 bytes -> 64 hex chars - Secret="$(head -c 32 /dev/urandom | od -An -tx1 | tr -d ' \n')" + Secret="$(head -c 16 /dev/urandom | od -An -tx1 | tr -d ' \n')" fi fi From 70f88187afdb2bf8815382f2c4bac7444d83107d Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 01:57:35 +0800 Subject: [PATCH 28/33] Update .env --- .env | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.env b/.env index ba52ac7..d94c22e 100644 --- a/.env +++ b/.env @@ -15,6 +15,11 @@ # 示例:export CLASH_URL='https://example.com/sub?token=xxx' export CLASH_URL='' +# 是否自动更新 Clash 订阅配置: +# true = 启动时检查订阅并重新下载/转换配置 +# false = 禁用自动更新,直接使用本地已有 config.yaml +export CLASH_AUTO_UPDATE="false" + # 订阅请求头(可选) # 常见机场需要 User-Agent;如不需要可留空 export CLASH_HEADERS='User-Agent: ClashforWindows/0.20.39' From 79f9e5167cacdca6341b20566ae0e9aafc75cacf Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 02:01:20 +0800 Subject: [PATCH 29/33] Update start.sh --- start.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/start.sh b/start.sh index f2be2b1..ec2c65b 100644 --- a/start.sh +++ b/start.sh @@ -448,8 +448,10 @@ if { [ "${SYSTEMD_MODE}" = "true" ] && [ -z "${URL:-}" ]; } || [ "${MANUAL_EMPTY SKIP_CONFIG_REBUILD=true fi +CLASH_AUTO_UPDATE="${CLASH_AUTO_UPDATE:-true}" + #################### Clash 订阅地址检测及配置文件下载 #################### -if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then +if [ "$SKIP_CONFIG_REBUILD" != "true" ] && [ "$CLASH_AUTO_UPDATE" = "true" ]; then echo -e '\n正在检测订阅地址...' Text1="Clash订阅地址可访问!" Text2="Clash订阅地址不可访问!" @@ -494,7 +496,7 @@ if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then fi #################### 下载订阅并生成 config.yaml(非兜底路径) #################### -if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then +if [ "$SKIP_CONFIG_REBUILD" != "true" ] && [ "$CLASH_AUTO_UPDATE" = "true" ]; then ensure_subconverter || true echo -e '\n正在下载Clash配置文件...' Text3="配置文件clash.yaml下载成功!" @@ -648,6 +650,12 @@ if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then fi fi +if [ "$SKIP_CONFIG_REBUILD" != "true" ] && [ "$CLASH_AUTO_UPDATE" != "true" ]; then + echo -e "\033[33m[WARN]\033[0m 已关闭自动更新订阅,使用本地已有配置启动" + ensure_fallback_config || true + SKIP_CONFIG_REBUILD=true +fi + # ========================================================= # 判断订阅是否已是完整 Clash YAML(Meta / Mihomo / Premium) # 若是完整配置,则直接使用,跳过后续代理拆解与拼接 From 9b97197acbe50a7fafcde0d6b1f77e5dfc48287a Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 02:06:49 +0800 Subject: [PATCH 30/33] Update start.sh --- start.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/start.sh b/start.sh index ec2c65b..244189a 100644 --- a/start.sh +++ b/start.sh @@ -660,7 +660,7 @@ fi # 判断订阅是否已是完整 Clash YAML(Meta / Mihomo / Premium) # 若是完整配置,则直接使用,跳过后续代理拆解与拼接 # ========================================================= -if grep -qE '^(proxies:|proxy-providers:|mixed-port:|port:)' "$Temp_Dir/clash.yaml"; then +if [ -s "$Temp_Dir/clash.yaml" ] && grep -qE '^(proxies:|proxy-providers:|mixed-port:|port:)' "$Temp_Dir/clash.yaml"; then echo "[INFO] subscription is a full Clash config, use it directly" cp -f "$Temp_Dir/clash.yaml" "$Conf_Dir/config.yaml" @@ -681,8 +681,8 @@ if grep -qE '^(proxies:|proxy-providers:|mixed-port:|port:)' "$Temp_Dir/clash.ya ln -sfn "$Dashboard_Src" "$Conf_Dir/ui" 2>/dev/null || true fi - SKIP_CONFIG_REBUILD=true - fi + SKIP_CONFIG_REBUILD=true +fi #################### 订阅转换/拼接(非兜底路径) #################### if [ "$SKIP_CONFIG_REBUILD" != "true" ]; then From b84b17f7cb36eeebcff02379cbe2890b8a9b8e88 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 02:11:50 +0800 Subject: [PATCH 31/33] Update start.sh --- start.sh | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/start.sh b/start.sh index 244189a..b423362 100644 --- a/start.sh +++ b/start.sh @@ -651,8 +651,21 @@ if [ "$SKIP_CONFIG_REBUILD" != "true" ] && [ "$CLASH_AUTO_UPDATE" = "true" ]; th fi if [ "$SKIP_CONFIG_REBUILD" != "true" ] && [ "$CLASH_AUTO_UPDATE" != "true" ]; then - echo -e "\033[33m[WARN]\033[0m 已关闭自动更新订阅,使用本地已有配置启动" - ensure_fallback_config || true + echo -e "\033[33m[WARN]\033[0m 已关闭自动更新订阅,优先使用本地已有配置启动" + + # 1) 优先使用已有 conf/config.yaml;没有才 fallback + if [ ! -s "$Conf_Dir/config.yaml" ]; then + ensure_fallback_config || true + fi + + # 2) 补齐运行必须字段 + force_write_controller_and_ui "$Conf_Dir/config.yaml" || true + force_write_secret "$Conf_Dir/config.yaml" || true + + # 3) 明确指定运行配置 + CONFIG_FILE="$Conf_Dir/config.yaml" + + # 4) 跳过后续“下载 / 转换 / 拼接”流程 SKIP_CONFIG_REBUILD=true fi @@ -838,7 +851,10 @@ ReturnStatus=$? if [ "$ReturnStatus" -eq 0 ]; then echo '' if [ "$EXTERNAL_CONTROLLER_ENABLED" = "true" ]; then - echo -e "Clash Dashboard 访问地址: http://${EXTERNAL_CONTROLLER}/ui" + SERVER_IP="$(hostname -I | awk '{print $1}')" + API_PORT="${EXTERNAL_CONTROLLER##*:}" + + echo -e "Clash Dashboard 访问地址: http://${SERVER_IP}:${API_PORT}/ui" SHOW_SECRET="${CLASH_SHOW_SECRET:-false}" SHOW_SECRET_MASKED="${CLASH_SHOW_SECRET_MASKED:-true}" From f41d75088cc32651ab49a9be6e1e4ea4503e4ed8 Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 02:14:02 +0800 Subject: [PATCH 32/33] Update .env --- .env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env b/.env index d94c22e..effea66 100644 --- a/.env +++ b/.env @@ -18,7 +18,7 @@ export CLASH_URL='' # 是否自动更新 Clash 订阅配置: # true = 启动时检查订阅并重新下载/转换配置 # false = 禁用自动更新,直接使用本地已有 config.yaml -export CLASH_AUTO_UPDATE="false" +export CLASH_AUTO_UPDATE="true" # 订阅请求头(可选) # 常见机场需要 User-Agent;如不需要可留空 From c74601c89240265fa2321c5498527767aa05738c Mon Sep 17 00:00:00 2001 From: wnlen <544241974@qq.com> Date: Tue, 17 Mar 2026 02:41:09 +0800 Subject: [PATCH 33/33] Update 1.png --- docs/assets/1.png | Bin 91585 -> 149811 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/1.png b/docs/assets/1.png index 90b4521b2575c2d2e0d9b38c8999188d1fdf53ae..be96fc1d5761c4b67f2fe7d5b8d2f941528a053c 100644 GIT binary patch literal 149811 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 z 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

bF_@bW!a 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 literal 91585 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