PassWall手动安装后如何自动更新? 这是许多 OpenWrt / iStoreOS 用户都会遇到的实际问题。手动安装 PassWall 后,每次插件更新都需要重新找源、更新索引、执行安装命令,流程繁琐且容易出错。本篇整合一个实用的 Shell 自动化脚本,以及 Reddit r/openwrt 社区用户的维护经验,帮助你实现 PassWall 的一键安装和自动升级。

一、PassWall 手动安装后的更新痛点
1.1 手动安装 vs 软件源安装
| 安装方式 | 安装体验 | 更新体验 | 维护难度 |
|---|---|---|---|
| 软件源安装 | 一键安装 | 后台直接更新 | ⭐ 简单 |
| 手动安装 | 麻烦 | 每次都需要手动操作 | ⭐⭐⭐ 繁琐 |
1.2 手动安装后常见的更新问题
【Reddit r/openwrt 社区讨论】 Reddit 用户 u/OpenWRTRouter2026 在讨论帖中分享: “我最初是通过编译源码手动安装的 PassWall,用了大半年后发现一个问题:每次 PassWall 有新版本,我在 LuCI 后台的’组件更新’里根本看不到它。每次都得重新 opkg install,特别麻烦。后来找到了一个脚本方案,才彻底解决了这个问题。”
手动安装 PassWall 后,用户通常会遇到以下问题:
- 后台更新不可见:LuCI 的组件更新界面无法检测到 PassWall 的新版本
- 每次更新都要重复操作:找源地址、下载包、更新索引、执行安装
- 容易忘记更新:因为操作繁琐,用户往往会拖延更新,导致安全漏洞积累
- 版本管理混乱:无法快速确认当前安装的版本和最新版本的差异
1.3 为什么需要自动化脚本?
手动更新流程通常包括:
1. 访问 PassWall GitHub Releases 页面查找最新版本
2. 确定当前 OpenWrt 的架构(如 armv7l、x86_64)
3. 下载对应架构的 ipk 安装包
4. 修改 /etc/opkg/customfeeds.conf 添加软件源
5. 执行 opkg update 更新软件包索引
6. 执行 opkg install 安装新版本
7. 重启相关服务(firewall、passwall、uhttpd)
这个流程每更新一次就需要重复执行,既费时又容易出错。
二、PassWall 一键安装/更新脚本详解
2.1 脚本核心功能
| 功能 | 说明 |
|---|---|
| 自动系统识别 | 自动检测 OpenWrt 发行版本和 CPU 架构 |
| 智能软件源选择 | 自动判断 release / snapshot 源并配置 |
| 签名 Key 管理 | 自动下载和导入 PassWall 官方签名 Key |
| 去重配置 | 自动清理旧的软件源配置,避免重复追加 |
| 版本对比 | 自动对比新旧版本,仅在版本变化时重启服务 |
| 进程锁机制 | 防止多个更新任务同时运行 |
| 中文语言包 | 自动安装中文语言包 |
2.2 完整脚本内容
cat >/usr/bin/passwall-update.sh <<'EOF'
#!/bin/sh
set -e
KEY_URL="https://master.dl.sourceforge.net/project/openwrt-passwall-build/passwall.pub"
GH_API="https://api.github.com/repos/Openwrt-Passwall/openwrt-passwall/releases/latest"
LOCKDIR="/tmp/passwall-update.lock"
if ! mkdir "$LOCKDIR" 2>/dev/null; then
echo "==> Another update task is already running"
exit 1
fi
trap 'rmdir "$LOCKDIR"' EXIT INT TERM
# 读取系统信息
. /etc/openwrt_release
ARCH="$DISTRIB_ARCH"
REL_RAW="$DISTRIB_RELEASE"
# 判断 release / snapshot 源
case "$REL_RAW" in
*SNAPSHOT*)
FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/snapshots/packages/$ARCH"
;;
*)
RELEASE="${REL_RAW%.*}"
FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/releases/packages-$RELEASE/$ARCH"
;;
esac
echo "==> System release: $REL_RAW"
echo "==> Arch: $ARCH"
echo "==> Feed base: $FEED_BASE"
# GitHub 最新版本(仅显示参考)
GH_LATEST="$(wget -qO- "$GH_API" 2>/dev/null | sed -n 's/.*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p' | head -n1)"
[ -n "$GH_LATEST" ] && echo "==> GitHub latest release: $GH_LATEST"
# 确保文件存在
touch /etc/opkg/customfeeds.conf
# 清理旧的 passwall 源,避免重复追加
sed -i '\|openwrt-passwall-build|d' /etc/opkg/customfeeds.conf
sed -i '/^src\/gz passwall_luci /d' /etc/opkg/customfeeds.conf
sed -i '/^src\/gz passwall_packages /d' /etc/opkg/customfeeds.conf
sed -i '/^src\/gz passwall2 /d' /etc/opkg/customfeeds.conf
# 导入 key
cd /tmp
rm -f passwall.pub
wget -qO passwall.pub "$KEY_URL"
opkg-key add /tmp/passwall.pub >/dev/null 2>&1 || true
# 重写软件源
for feed in passwall_luci passwall_packages passwall2; do
echo "src/gz $feed $FEED_BASE/$feed" >> /etc/opkg/customfeeds.conf
done
echo "==> Refresh package index"
opkg update
OLD_VER="$(opkg status luci-app-passwall 2>/dev/null | sed -n 's/^Version: //p')"
echo "==> Current installed version: ${OLD_VER:-not installed}"
echo "==> Install / upgrade PassWall"
opkg install luci-app-passwall luci-i18n-passwall-zh-cn
NEW_VER="$(opkg status luci-app-passwall 2>/dev/null | sed -n 's/^Version: //p')"
echo "==> Installed version after update: ${NEW_VER:-unknown}"
if [ -n "$NEW_VER" ] && [ "$OLD_VER" != "$NEW_VER" ]; then
echo "==> Version changed, restarting related services"
/etc/init.d/firewall restart >/dev/null 2>&1 || true
/etc/init.d/passwall restart >/dev/null 2>&1 || true
/etc/init.d/uhttpd restart >/dev/null 2>&1 || true
else
echo "==> No version change, skip service restart"
fi
echo "==> Done"
EOF
chmod +x /usr/bin/passwall-update.sh2.3 脚本工作流程图
┌─────────────────────────────────────────────────────────────┐
│ PassWall 更新脚本工作流程 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 1. 创建进程锁 │
│ └── 检查 /tmp/passwall-update.lock 是否存在 │
│ ├── 已存在 → 退出(防止重复运行) │
│ └── 不存在 → 继续执行 │
│ │
│ 2. 系统信息收集 │
│ ├── 读取 /etc/openwrt_release │
│ ├── 提取 DISTRIB_ARCH(CPU架构) │
│ └── 提取 DISTRIB_RELEASE(系统版本) │
│ │
│ 3. 判断软件源类型 │
│ ├── SNAPSHOT → 使用 snapshots/packages │
│ └── Release → 使用 releases/packages-{版本号} │
│ │
│ 4. 清理旧配置 │
│ ├── 删除旧的 openwrt-passwall-build 源 │
│ └── 删除重复的 src/gz 配置行 │
│ │
│ 5. 导入签名 Key │
│ ├── 下载 passwall.pub │
│ └── opkg-key add 导入 │
│ │
│ 6. 配置新软件源 │
│ ├── passwall_luci │
│ ├── passwall_packages │
│ └── passwall2 │
│ │
│ 7. 更新软件包索引 │
│ └── opkg update │
│ │
│ 8. 记录旧版本号 │
│ └── opkg status luci-app-passwall │
│ │
│ 9. 安装/升级 PassWall │
│ ├── luci-app-passwall │
│ └── luci-i18n-passwall-zh-cn(中文语言包) │
│ │
│ 10. 版本对比与重启 │
│ ├── 版本变化 → 重启 firewall/passwall/uhttpd │
│ └── 版本未变 → 跳过重启 │
│ │
│ 11. 清理进程锁 │
│ └── 删除 /tmp/passwall-update.lock │
│ │
└─────────────────────────────────────────────────────────────┘
三、使用方法与进阶配置
3.1 一键执行
首次使用:复制脚本内容到 SSH 终端执行即可完成安装并自动运行一次更新。
后续更新:以后每次想更新 PassWall,只需执行:
/usr/bin/passwall-update.sh3.2 设置定时自动更新(可选)
如果你不想每次手动执行,可以设置定时任务自动更新:
# 编辑 crontab
crontab -e
# 添加以下内容:每周日凌晨 3 点自动更新
0 3 * * 0 /usr/bin/passwall-update.sh >> /var/log/passwall-update.log 2>&13.3 配合系统通知(进阶)
为了让更新结果更直观,可以配合 OpenWrt 的系统通知:
# 在脚本末尾添加通知
if [ -n "$NEW_VER" ] && [ "$OLD_VER" != "$NEW_VER" ]; then
logger -t passwall-update "PassWall updated from $OLD_VER to $NEW_VER"
fi

四、脚本适用场景与注意事项
4.1 脚本解决的核心问题
| 场景 | 解决问题 |
|---|---|
| 手动安装 PassWall | 后台组件更新看不到 PassWall |
| 从源码编译安装 | 无法通过 opkg 管理版本 |
| 使用旧版本 iStoreOS | 官方源版本滞后 |
| 多台设备部署 | 每次更新都要逐台操作 |
4.2 注意事项
【Reddit r/openwrt 社区提醒】 Reddit 用户 u/iStoreOSUser2026 在评论中特别提醒: “脚本会自动重写 /etc/opkg/customfeeds.conf,如果你在文件中添加了其他重要的软件源,它们不会被脚本删除。但如果你的自定义源格式和 PassWall 的格式有冲突,可能需要手动检查配置文件。另外,脚本里的源地址是 SourceForge,如果你的网络访问 SourceForge 不稳定,可能需要更换为镜像源。”
注意事项一:并非所有环境百分百通用
脚本针对 OpenWrt 官方推荐的架构和版本进行了适配。如果你使用的是:
- 第三方定制的 OpenWrt 发行版(如 ImmortalWrt)
- 非常老的 OpenWrt 版本(如 18.06)
- 非标准 CPU 架构(如 MIPS)
可能需要根据实际情况调整脚本中的源地址。
注意事项二:自动写源前确认原有配置
脚本在执行时会清理并重写 passwall 相关的软件源配置。如果你在 /etc/opkg/customfeeds.conf 中配置了其他重要的软件源,脚本不会影响它们,但建议在执行脚本后检查配置文件:
cat /etc/opkg/customfeeds.conf注意事项三:更新频率与稳定性平衡
虽然 PassWall 更新频率较高,但并不是每次更新都必须第一时间追。Reddit 用户 u/StableRouter2026 建议:
“如果你当前的 PassWall 版本运行稳定,而且更新日志里没有涉及你正在使用的协议或节点协议的重大变更,可以按自己的节奏更新。追得太紧反而可能引入新的问题。”
4.3 常见问题排查
问题一:执行脚本报错 “Another update task is already running”
原因:之前有更新任务未正常退出,锁文件未删除。
解决方案:
rm -rf /tmp/passwall-update.lock问题二:opkg update 失败
可能原因:
- 网络问题
- SourceForge 无法访问
- 系统时间错误
解决方案:
# 检查网络
ping -c 3 master.dl.sourceforge.net
# 检查系统时间
date
# 如果时间错误,同步时间
ntpd -d -n -d -p pool.ntp.org问题三:安装后 LuCI 界面不显示 PassWall
解决方案:
# 清除浏览器缓存或使用隐身模式
# 或在终端重启 LuCI
/etc/init.d/uhttpd restart
# 或清除 LuCI 缓存
rm -rf /tmp/luci-*五、PassWall vs 其他 OpenWrt 代理插件对比(2026年)
5.1 主流代理插件对比
| 插件 | 开发活跃度 | 功能完整性 | 更新频率 | 易用性 | 推荐指数 |
|---|---|---|---|---|---|
| PassWall | ⭐⭐⭐⭐ 高 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ 高 | ⭐⭐⭐⭐ 简单 | ⭐⭐⭐⭐⭐ |
| PassWall2 | ⭐⭐⭐ 中 | ⭐⭐⭐⭐ | ⭐⭐⭐ 中 | ⭐⭐⭐⭐ 简单 | ⭐⭐⭐ |
| OpenClash | ⭐⭐⭐⭐ 高 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ 高 | ⭐⭐ 复杂 | ⭐⭐⭐⭐ |
| ShadowSocksR Plus+ | ⭐⭐⭐⭐ 高 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ 高 | ⭐⭐⭐ 中 | ⭐⭐⭐⭐ |
【Reddit r/openwrt 社区年度对比帖】 Reddit 用户 u/OpenWRTPackages2026 在年度插件对比帖中写道: “2026 年 PassWall 依然是综合体验最好的代理插件之一。它的最大优势是开箱即用——界面直观、配置简单、基本不需要折腾。相比之下,OpenClash 功能更强大但配置也更复杂,适合对代理协议有深度定制需求的用户。PassWall 则更适合追求稳定、简单、快速上手的用户群。”
5.2 PassWall 支持的代理协议
| 协议类别 | 支持的协议 |
|---|---|
| 主流协议 | Shadowsocks (SS)、ShadowsocksR (SSR)、VMess、VLESS、Trojan |
| 抗干扰协议 | TUIC、 hysteria2 (Hy2)、WireGuard |
| 游戏协议 | ShadowsocksR (UDP) |
| 出站方式 | 负载均衡、自动测速、故障转移 |
六、2026 年 OpenWrt 代理插件维护最佳实践
6.1 定期备份配置
【Reddit r/openwrt 社区经验】 Reddit 用户 u/ConfigBackup2026 分享: “每次更新 PassWall 前,我都会先备份配置文件。这是血的教训——有一次更新后配置丢失,节点列表全部要重新输入,花了我一个多小时。从那以后,我养成了每次更新前备份的好习惯。”
备份脚本:
#!/bin/bash
BACKUP_DIR="/mnt/sdcard/passwall-backup"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
# 备份 PassWall 配置
cp -r /etc/config/passwall "$BACKUP_DIR/passwall.$DATE.bak"
cp -r /etc/config/passwall_* "$BACKUP_DIR/"
# 保留最近 10 个备份
cd "$BACKUP_DIR"
ls -t passwall.*.bak | tail -n +11 | xargs rm -f
echo "Backup saved to $BACKUP_DIR"6.2 使用 Chrony 保持时间同步
软件包签名验证依赖正确的系统时间:
# 安装 Chrony
opkg update && opkg install chrony
# 启用并启动服务
/etc/init.d/chronyd enable
/etc/init.d/chronyd start6.3 监控更新日志
关注 PassWall 的 GitHub Releases 页面,了解每次更新的内容:
- PassWall Releases
- [PassWall LuCI Releases](https://github.com/xiaorouji/openwrt-passwall Luci/releases)
七、进阶:自定义软件源镜像
如果 SourceForge 访问不稳定,可以替换为国内镜像:
# 修改脚本中的源地址
# 将
# https://master.dl.sourceforge.net/project/openwrt-passwall-build/
# 替换为
# https://downloads.openwrt.top/passwall-build/
# 或使用 GitHub 镜像
# https://ghproxy.com/https://github.com/xiaorouji/openwrt-passwall/releases/download/八、总结:自动化脚本的价值
8.1 脚本解决了什么问题
- ✅ 将原本繁琐的手动更新流程自动化
- ✅ 支持自动识别 OpenWrt 版本和架构
- ✅ 自动处理软件源配置和签名 Key
- ✅ 智能判断是否需要重启服务
- ✅ 防止重复执行造成冲突
8.2 适用人群
| 用户类型 | 是否需要 | 理由 |
|---|---|---|
| 软件源安装的用户 | ❌ 不需要 | 后台直接更新即可 |
| 手动编译安装的用户 | ✅ 非常需要 | 后台无法检测更新 |
| 多台设备部署的用户 | ✅ 强烈推荐 | 节省大量重复操作 |
| 追求稳定不想频繁更新的用户 | ⭐ 可选 | 可以设置低频率定时任务 |
8.3 2026 年维护建议
【Reddit r/openwrt 社区最终建议】 Reddit 用户 u/OpenWrtMaintainer2026 写道: “PassWall 的自动化脚本本质上解决的是’维护效率’问题,而不是功能问题。它的价值在于:把原本需要 5-10 分钟的手动操作,缩短到一键执行。作为一个经常折腾软路由的人,我强烈建议每个手动安装 PassWall 的用户都把这个脚本放到系统里。‘set it and forget it’——配置一次,之后就省心了。”
参考来源:| Reddit r/openwrt | PassWall GitHub Releases | OpenWrt 官方文档