目录

Hiddify 代理客户端彻底卸载指南:从 apt purge 到数据清空的完整方案

apt remove 只卸程序,数据目录才是残留大户——教你一步步清干净

为什么 Hiddify 卸载不彻底?

你在 Ubuntu 上通过 sudo apt install -y /data/下载/Hiddify-Debian-x64.deb 安装了 Hiddify 桌面客户端,用了一段时间后发现不想用了,于是执行了 sudo apt purge -y hiddify,心想这下应该干净了。

结果没过几天,你注意到系统里还有一些奇怪的残留:~/.config/ 下还有 Hiddify 的配置文件,~/.local/share/app.hiddify.com/ 里躺着你的订阅数据,甚至可能还有一张不再需要的 TUN 虚拟网卡。

问题出在哪里? 原因在于 Linux 软件卸载的两层隔离机制——apt 只管系统级文件(/usr//etc/),而用户级数据(~/.config/~/.local/~/.cache/)是应用程序在运行时自己创建的,apt 不会动它们。这是 GNU 软件管理的经典设计:尊重用户数据,不越界清理。

但代价是:卸载不彻底。如果你正准备换用其他代理工具,或者遇到 Hiddify 残留导致的冲突,就必须手动完成剩下的清理工作。

下面给出经过实战验证的完整卸载方案。

[ILLUSTRATION: apt 卸载边界示意图——上方是 apt 管理的系统目录(/usr、/etc),下方是用户目录(/.config、/.local、~/.cache);apt purge 只清除上方,下方需要手动清理]


第一步:确认包名并 Purge 卸载

1.1 查清包名

deb 安装包的名字不一定和软件名一致。先确认准确的包名:

dpkg -l | grep -i hiddify

输出示例:

ii  hiddify                                    4.1.1+40101                                amd64        Cross Platform Multi Protocol Proxy Frontend.

ii 表示已安装状态,第一列是包名 hiddify,第二列是版本号 4.1.1+40101。如果输出多行,说明有多个相关包,下面命令中的 hiddify 需要替换为实际包名。

1.2 执行 Purge

关键区别apt remove 只删除程序文件,保留配置文件;apt purge 两者都删。这一步必须用 purge

sudo apt purge -y hiddify
sudo apt autoremove -y

autoremove 的作用是清理那些当初因安装 Hiddify 而被自动拉入、现在已无依赖的库文件。

执行过程中你会看到类似输出:

正在卸载 hiddify (4.1.1+40101) ...
Removing Hiddify user data...
Removed data from /home/oklife
Hiddify data cleanup complete.
正在处理用于 hicolor-icon-theme (0.18-2build1) 的触发器 ...
正在处理用于 gnome-menus (3.38-1build1) 的触发器 ...
正在处理用于 desktop-file-utils (0.28-3build1) 的触发器 ...
(正在读取数据库 ... 系统当前共安装有 289832 个文件和目录。)
正在清除 hiddify (4.1.1+40101) 的配置文件 ...
rm: 无法删除 '/usr/bin/hiddify': 没有那个文件或目录
Removing Hiddify user data...
Hiddify data cleanup complete.

注意这个 rm: 无法删除 '/usr/bin/hiddify': 没有那个文件或目录——这不是错误,说明 Hiddify 的启动脚本在卸载时尝试删除自己的二进制文件,但 dpkg 已经在此之前移除了它,所以报了"找不到"。可以忽略。

1.3 为什么 purge 还不够

即使用了 purge,你仍然会发现:

ls -la ~/.config/ | grep -i hiddify
ls -la ~/.local/share/ | grep -i hiddify
ls -la ~/.cache/ | grep -i hiddify

这些目录下可能仍有残留。因为 dpkg 的 purge 只清理 /etc/ 下的系统配置文件和包管理器记录的元数据,用户 home 目录下的数据永远不归 apt 管,这是 GNU 软件管理的经典设计原则——尊重用户数据,不越界清理。

[ILLUSTRATION: 用户数据残留示意图——三个箭头分别从 /.config/、/.local/share/app.hiddify.com、~/.cache/ 指向"手动删除"标签,配文:apt purge 不管这里]


第二步:清理用户级残留数据

Hiddify 在运行过程中会在以下位置写入数据,需要逐一清理:

2.1 配置文件(~/.config/)

rm -rf ~/.config/*hiddify* ~/.config/*Hiddify*

这里存放的是 Hiddify 的运行配置,包括代理规则、界面设置等。

2.2 应用数据(~/.local/share/)

rm -rf ~/.local/share/app.hiddify.com

这是最核心的残留目录。 根据官方 issue #1964app.hiddify.com 是 Hiddify 客户端的主数据目录,存放:

  • 订阅配置文件(你的节点列表)
  • 运行状态数据
  • 代理规则缓存

apt purge 不会碰这个目录。

2.3 缓存文件(~/.cache/)

rm -rf ~/.cache/*hiddify* ~/.cache/*Hiddify*

缓存主要是程序运行时的临时数据,不影响功能,但清理后可以让磁盘更干净。

2.4 自启动项(~/.config/autostart/)

rm -rf ~/.config/autostart/*hiddify*

如果你在设置中开启了"开机自启动",Hiddify 会在 autostart 目录下注册一个 .desktop 文件。卸载后这个文件可能还在,下次登录时系统会尝试启动一个已经不存在的程序。

2.5 Root 账号下的数据(重要!)

如果你曾经用 sudo 打开过 Hiddify(比如为了启用 TUN 模式),那么 root 用户下也有一份独立的数据目录:

sudo rm -rf /root/.local/share/app.hiddify.com

这一步经常被遗漏。 root 数据和用户数据是完全隔离的,清理用户目录时不会触及 /root/ 下的内容。

[ILLUSTRATION: Hiddify 数据分布图——以树状结构展示 /$config、/.local/share/app.hiddify.com、~/.cache、/root/.local/share/app.hiddify.com 四个残留位置,每个位置标注数据类型(配置/订阅/缓存/自启动)]


第三步:TUN 虚拟网卡专项处理

3.1 为什么需要单独处理

Hiddify 支持 TUN 模式——这是一种让系统所有流量都走代理的机制。TUN 模式在 Linux 上通过创建虚拟网卡(如 singboxtun0)实现,虚拟网卡是运行时动态创建的,进程退出时应该自动释放

但在某些情况下(程序异常退出、内核 bug、权限问题),TUN 接口可能没有被正确删除,留下一个"僵尸"网卡。这会导致:

  • 网络配置混乱,新代理工具可能冲突
  • ip link show 能看到已不存在的网卡
  • 路由表中有残留规则

3.2 检查 TUN 残留

ip link show | grep -i tun
ip rule list | grep -i singbox
ip route show table singbox 2>/dev/null

如果看到类似 singboxtun0 的接口或 singbox 路由表规则,说明有残留。

3.3 清理 TUN 残留

参考 sing-box 官方 issue #3274AskUbuntu 方案,手动清理:

# 删除 TUN 接口
sudo ip link delete singboxtun0 2>/dev/null || echo "接口已不存在"

# 删除相关路由规则
sudo ip rule del from all lookup singbox 2>/dev/null || echo "规则已不存在"

# 删除默认路由(如果存在)
sudo ip route del default dev singboxtun0 table singbox 2>/dev/null || echo "路由已不存在"

每条命令都用 2>/dev/null || echo "..." 做了容错——如果接口或规则已经不存在,不会报错中断。

3.4 普通卸载无需担心

如果你从未启用过 TUN 模式,或者 Hiddify 是正常退出的,那么 TUN 接口会在进程结束时自动释放,不需要执行上面的清理步骤。


第四步:验证卸载结果

执行以下三条检查命令,确认是否彻底清理干净:

4.1 包管理层面

dpkg -l | grep -i hiddify

预期结果:无输出。如果有输出,说明包未完全卸载,重新执行 sudo apt purge -y hiddify

4.2 文件系统层面

find ~ -iname "*hiddify*" -not -path "*/snap/firefox/*" 2>/dev/null

预期结果:无输出。

注意:如果你曾用 Firefox 访问过 hiddifyfree.github.io 等 Hiddify 相关网站,Firefox 会按 Web Storage API 规范在该域名下建立本地存储缓存(路径类似 ~/.mozilla/firefox/*/storage/default/https+++hiddifyfree.github.io)。这是浏览器行为,与 Hiddify 软件无关,可以安全忽略,也可以在 Firefox 的 about:preferences#privacy 中搜索 hiddify 单独清理。

4.3 进程层面

ps aux | grep -i hiddify | grep -v grep
which hiddify 2>/dev/null

预期结果:均无输出。

[ILLUSTRATION: 验证结果对照表——三行分别对应 dpkg -l、find、ps aux 命令,预期结果列统一为"无输出",附注说明 Firefox 缓存除外]


常见问题

Q1:卸载后磁盘空间没变化多少?

apt purge 卸载程序本体后释放的空间通常只有几 MB 到几十 MB(Hiddify 包本身不大)。用户数据目录里的订阅配置和缓存通常也不大。如果你发现磁盘占用变化不明显,可能是正常现象。

Q2:我装的是 Hiddify-Manager(服务端),不是桌面客户端,怎么办?

Hiddify-Manager 是服务端版本,卸载方式不同。它通常通过 systemd 服务运行,需要:

sudo systemctl stop hiddify-manager
sudo systemctl disable hiddify-manager
sudo rm -rf /etc/hiddify /opt/hiddify-manager /var/lib/hiddify-manager
sudo apt purge -y hiddify-manager

详见 GitHub 官方卸载脚本

Q3:卸载后想重装,订阅数据能恢复吗?

不能。数据目录被手动删除后不可恢复。建议在卸载前备份:

cp -r ~/.local/share/app.hiddify.com ~/Documents/hiddify-backup-$(date +%Y%m%d)

Q4:删除后 apt update 还会提示有 Hiddify 相关的仓库吗?

如果当初是通过官方 APT 仓库安装的(而不是直接 apt install .deb),需要额外移除仓库源:

# 查看是否添加了 Hiddify 仓库
ls /etc/apt/sources.list.d/ | grep -i hiddify

# 如果有,删除对应文件
sudo rm /etc/apt/sources.list.d/hiddify*.list
sudo apt update

直接安装 .deb 文件的方式不会有这个问题。


完整一键脚本

如果你追求效率,可以把上面所有步骤合并成一个脚本:

#!/bin/bash
set -euo pipefail

echo "=== Hiddify 彻底卸载脚本 ==="

# 第1步:purge 包
echo "[1/4] 卸载软件包..."
sudo apt purge -y hiddify
sudo apt autoremove -y

# 第2步:清理用户数据
echo "[2/4] 清理用户数据..."
rm -rf ~/.config/*hiddify* ~/.config/*Hiddify*
rm -rf ~/.local/share/app.hiddify.com
rm -rf ~/.cache/*hiddify* ~/.cache/*Hiddify*
rm -rf ~/.config/autostart/*hiddify*
sudo rm -rf /root/.local/share/app.hiddify.com

# 第3步:清理 TUN 残留(容错执行)
echo "[3/4] 清理 TUN 残留..."
sudo ip link delete singboxtun0 2>/dev/null || true
sudo ip rule del from all lookup singbox 2>/dev/null || true
sudo ip route del default dev singboxtun0 table singbox 2>/dev/null || true

# 第4步:验证
echo "[4/4] 验证卸载结果..."
if dpkg -l | grep -i hiddify; then
    echo "⚠️  警告:包仍未完全卸载"
else
    echo "✅ 包已卸载"
fi

REMAINING=$(find ~ -iname "*hiddify*" -not -path "*/snap/firefox/*" 2>/dev/null | wc -l)
if [ "$REMAINING" -eq 0 ]; then
    echo "✅ 用户数据已清理"
else
    echo "⚠️  警告:发现 $REMAINING 个残留文件"
    find ~ -iname "*hiddify*" -not -path "*/snap/firefox/*" 2>/dev/null
fi

echo "=== 卸载完成 ==="

保存为 ~/uninstall-hiddify.sh,执行 bash ~/uninstall-hiddify.sh 即可。


关联阅读

  • [[一分钟变更一条开关修复APT在WSL网络连接是否走代理问题]]
  • [[WSL关于Cloudflare WARP代理]]

参考来源