Files
clash-for-linux/uninstall.sh
2026-01-14 16:22:46 +08:00

177 lines
5.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
set -euo pipefail
# =========================
# 基础参数(与 install.sh 对齐)
# =========================
Install_Dir="${CLASH_INSTALL_DIR:-/opt/clash-for-linux}"
Service_Name="clash-for-linux"
Service_User="${CLASH_SERVICE_USER:-clash}"
Service_Group="${CLASH_SERVICE_GROUP:-$Service_User}"
# 是否删除运行用户/组(默认不删,更安全;想删就 CLASH_REMOVE_USER=true
CLASH_REMOVE_USER="${CLASH_REMOVE_USER:-false}"
# 彩色输出
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}"
# =========================
# 1) 停止服务systemd
# =========================
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
fi
# =========================
# 2) 兜底:杀掉残留进程(防止删目录后仍占端口)
# - 优先按 PID 文件
# - 再按二进制名/路径兜底
# =========================
PID_FILE=""
if [ -d "${Install_Dir}/temp" ] && [ -f "${Install_Dir}/temp/clash.pid" ]; then
PID_FILE="${Install_Dir}/temp/clash.pid"
fi
if [ -n "$PID_FILE" ]; then
PID="$(cat "$PID_FILE" 2>/dev/null || true)"
if [ -n "${PID:-}" ] && kill -0 "$PID" 2>/dev/null; then
info "检测到 PID_FILE 进程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
fi
ok "已停止 clash 进程PID_FILE"
fi
fi
# 兜底:按进程名
if pgrep -x clash >/dev/null 2>&1; then
warn "检测到残留 clash 进程,执行 pkill..."
pkill clash >/dev/null 2>&1 || true
sleep 1
fi
if pgrep -x clash >/dev/null 2>&1; then
warn "clash 仍残留,执行 pkill -9..."
pkill -9 clash >/dev/null 2>&1 || true
fi
# =========================
# 3) 清理 systemd unit兼容不同路径
# =========================
remove_unit_file() {
local p="$1"
if [ -f "$p" ]; then
rm -f "$p"
ok "已移除 unit: $p"
fi
}
remove_unit_file "/etc/systemd/system/${Service_Name}.service"
remove_unit_file "/usr/lib/systemd/system/${Service_Name}.service"
remove_unit_file "/lib/systemd/system/${Service_Name}.service"
# reload systemd
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) 清理 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"
fi
# =========================
# 5) 清理环境变量脚本 / 默认配置
# =========================
if [ -f "/etc/default/${Service_Name}" ]; then
rm -f "/etc/default/${Service_Name}"
ok "已移除: /etc/default/${Service_Name}"
fi
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 "/etc/profile.d/clash.sh" ]; then
warn "检测到旧版 /etc/profile.d/clash.sh非本脚本必然生成如确认无用可手动删除"
fi
# =========================
# 6) 清理命令入口
# =========================
if [ -f "/usr/local/bin/clashctl" ]; then
rm -f "/usr/local/bin/clashctl"
ok "已移除: /usr/local/bin/clashctl"
fi
# =========================
# 7) 清理安装目录
# =========================
if [ -d "$Install_Dir" ]; then
rm -rf "$Install_Dir"
ok "已移除安装目录: ${Install_Dir}"
else
warn "未找到安装目录: ${Install_Dir}"
fi
# =========================
# 8) 可选:删除运行用户/组(默认不删)
# =========================
if [ "$CLASH_REMOVE_USER" = "true" ]; then
warn "CLASH_REMOVE_USER=true将尝试删除运行用户/组(若存在且无依赖)"
# 先删用户
if id "$Service_User" >/dev/null 2>&1; then
userdel "$Service_User" >/dev/null 2>&1 || true
ok "已删除用户: ${Service_User}(如有依赖可能未删除,请检查)"
fi
# 再删组(仅当组存在且无成员依赖时)
if getent group "$Service_Group" >/dev/null 2>&1; then
groupdel "$Service_Group" >/dev/null 2>&1 || true
ok "已删除组: ${Service_Group}(如有依赖可能未删除,请检查)"
fi
else
info "默认不删除用户/组更安全。如需删除CLASH_REMOVE_USER=true sudo bash uninstall.sh"
fi
# =========================
# 9) 清理当前 shell 的代理变量提示(不修改你的 shell只提示
# =========================
echo
warn "如果你之前开启过 proxy_on当前终端可能还残留代理环境变量。可执行"
echo " unset http_proxy https_proxy no_proxy HTTP_PROXY HTTPS_PROXY NO_PROXY"
echo " # 或重新打开一个新终端"
echo
ok "卸载完成 ✅"