PassWall 一键安装/更新脚本分享:手动安装用户也能快速升级
一直以来,PassWall 都算是 OpenWrt / iStoreOS 里非常常用的插件之一。但有一个问题也很现实:如果你最开始是手动安装的 PassWall,后面往往就没法像普通组件那样,直接在后台里点更新完成升级。
这就导致一个很麻烦的情况——每次 PassWall 有新版本,你都得重新找源、找包、更新索引、执行安装命令。一次两次还好,次数多了之后,真的挺折腾。
所以这篇文章,我想分享一个我自己觉得很实用的方法:直接用 shell 脚本实现 PassWall 的一键安装 / 一键更新。
这段脚本最大的意义,不是什么“黑科技”,而是把原本重复、零散的操作流程整合到一起。以后如果要升级 PassWall,基本只需要执行一个脚本就行,省事很多。
脚本内容
下面是完整脚本:
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.sh
/usr/bin/passwall-update.sh
使用方法
通过 FinalShell 或者 TTYD 终端 登录 OpenWrt 。
输入上面的脚本代码后回车即可。
执行后,如果一切正常,终端会输出当前系统版本、架构、软件源地址、旧版本号、新版本号,以及是否重启相关服务。
这段脚本解决了什么问题
这段脚本最适合下面这类用户:
- 之前是手动安装 PassWall 的用户
- 后台组件更新里看不到 PassWall 更新的用户
- 想尽量减少重复命令操作的用户
- 希望脚本自动判断系统版本和架构的用户
它做的事情其实很直接:
- 自动读取系统架构
- 自动判断当前系统是 release 版还是 snapshot 版
- 自动拼接对应的软件源地址
- 自动导入 PassWall 的签名 key
- 自动写入
customfeeds.conf - 自动执行
opkg update - 自动安装或升级 PassWall 主程序和中文语言包
- 如果版本有变化,自动重启相关服务
换句话说,它把原本需要手动一步步敲的命令,收敛成了一次执行。
我觉得需要注意的几点
虽然这个脚本很方便,但我还是建议先把注意事项了解清楚。
1. 并不是所有环境都百分百通用
脚本本质上依赖的是系统版本、架构、网络连通性以及 feed 可用性。如果你的固件环境比较特殊,或者某些组件已经被改过,运行前最好还是自己先看一下逻辑。
2. 自动写源前最好确认原有配置
脚本会修改 /etc/opkg/customfeeds.conf。如果你本身就有自定义源配置,建议先备份一下,避免和原有内容冲突。
3. 更新不是越快越好
虽然 PassWall 更新频率高,但也不是说每次更新都必须第一时间追。如果你当前环境很稳定,而且更新日志里没有你特别在意的改动,其实也可以按自己的节奏更新。
总的来说,这个脚本最有价值的地方,不是“实现了更新”本身,而是把 PassWall 手动安装用户后续最常见的维护流程做了整理和简化。它能够自动识别系统版本和架构、自动配置软件源、自动安装升级、自动判断是否需要重启服务,实用性还是很高的。如果你平时本来就经常手动更新 PassWall,那把这段脚本放到系统里备用,确实能省掉不少重复劳动。