passwall脚本
cat >/usr/bin/passwall-update.sh <<'EOF'
#!/bin/sh
KEY_URL="https://master.dl.sourceforge.net/project/openwrt-passwall-build/passwall.pub"
LOCKDIR="/tmp/passwall-update.lock"
if ! mkdir "$LOCKDIR" 2>/dev/null; then
echo "==> Error: Another update task is already running."
exit 1
fi
trap 'rmdir "$LOCKDIR"' EXIT INT TERM
# 1. 获取系统环境
. /etc/openwrt_release
ARCH="$DISTRIB_ARCH"
REL_RAW="$DISTRIB_RELEASE"
# 2. 匹配软件源路径 (针对 24.10 或更高版本进行适配)
case "$REL_RAW" in
*SNAPSHOT*)
FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/snapshots/packages/$ARCH"
;;
*)
# 提取主版本号,例如 23.05.3 -> 23.05
RELEASE=$(echo "$REL_RAW" | cut -d. -f1-2)
FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/releases/packages-$RELEASE/$ARCH"
;;
esac
echo "==> System: $REL_RAW ($ARCH)"
echo "==> Feed: $FEED_BASE"
# 3. 更新公钥
wget -qO /tmp/passwall.pub "$KEY_URL"
opkg-key add /tmp/passwall.pub >/dev/null 2>&1
# 4. 刷新软件源配置 (清理旧的 passwall 记录)
touch /etc/opkg/customfeeds.conf
sed -i '\|openwrt-passwall-build|d' /etc/opkg/customfeeds.conf
# 针对经典版 PassWall,通常只需要 luci_app 和 packages 两个源
for feed in passwall_luci passwall_packages; do
echo "src/gz $feed $FEED_BASE/$feed" >> /etc/opkg/customfeeds.conf
done
# 5. 更新索引
echo "==> Updating package lists (ignoring unrelated errors)..."
opkg update >/dev/null 2>&1 || echo "Notice: Some feeds failed, continuing anyway..."
# 6. 检查版本
OLD_VER="$(opkg status luci-app-passwall 2>/dev/null | sed -n 's/^Version: //p')"
echo "==> Current Version: ${OLD_VER:-Not installed}"
# 7. 安装/升级 (经典版包名为 luci-app-passwall)
echo "==> Installing/Upgrading PassWall..."
opkg install luci-app-passwall luci-i18n-passwall-zh-cn --force-overwrite
# 8. 验证与重启服务
NEW_VER="$(opkg status luci-app-passwall 2>/dev/null | sed -n 's/^Version: //p')"
if [ -n "$NEW_VER" ]; then
echo "==> Success! Version: $NEW_VER"
if [ "$OLD_VER" != "$NEW_VER" ]; then
echo "==> Restarting services..."
/etc/init.d/passwall restart >/dev/null 2>&1 || true
/etc/init.d/uhttpd restart >/dev/null 2>&1 || true
echo "==> Done."
fi
else
echo "!!> Error: Installation failed. Please check your network or architecture."
fi
EOF
chmod +x /usr/bin/passwall-update.sh
/usr/bin/passwall-update.sh
passwall2脚本
cat >/usr/bin/passwall2-update.sh <<'EOF'
#!/bin/sh
# 移除 set -e,改用手动逻辑控制,避免因无关的软件源错误导致脚本中断
# 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-passwall2/releases/latest"
LOCKDIR="/tmp/passwall2-update.lock"
if ! mkdir "$LOCKDIR" 2>/dev/null; then
echo "==> 错误: 另一个更新任务正在运行。"
exit 1
fi
trap 'rmdir "$LOCKDIR"' EXIT INT TERM
# 1. 读取系统信息
. /etc/openwrt_release
ARCH="$DISTRIB_ARCH"
REL_RAW="$DISTRIB_RELEASE"
# 2. 判断版本并构建 Feed 地址
case "$REL_RAW" in
*SNAPSHOT*)
FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/snapshots/packages/$ARCH"
;;
*)
# 提取主版本号,例如 24.10.0 -> 24.10
RELEASE=$(echo "$REL_RAW" | cut -d. -f1-2)
FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/releases/packages-$RELEASE/$ARCH"
;;
esac
echo "==> 系统版本: $REL_RAW"
echo "==> 架构: $ARCH"
echo "==> 软件源地址: $FEED_BASE"
# 3. 导入公钥 (静默执行)
wget -qO /tmp/passwall.pub "$KEY_URL"
opkg-key add /tmp/passwall.pub >/dev/null 2>&1
# 4. 刷新 customfeeds.conf
touch /etc/opkg/customfeeds.conf
sed -i '\|openwrt-passwall-build|d' /etc/opkg/customfeeds.conf
sed -i '/passwall/d' /etc/opkg/customfeeds.conf
for feed in passwall_luci passwall_packages passwall2; do
echo "src/gz $feed $FEED_BASE/$feed" >> /etc/opkg/customfeeds.conf
done
# 5. 更新索引 (忽略无关源的报错)
echo "==> 正在更新软件包列表 (请忽略其他源的报错)..."
opkg update >/dev/null 2>&1 || echo "提示: 部分软件源更新失败,但我们将继续尝试安装 PassWall。"
# 6. 检查当前版本
OLD_VER="$(opkg status luci-app-passwall2 2>/dev/null | sed -n 's/^Version: //p')"
echo "==> 当前安装版本: ${OLD_VER:-未安装}"
# 7. 执行安装/升级
echo "==> 正在尝试安装/升级 PassWall2..."
# 使用 --force-overwrite 以防文件冲突
opkg install luci-app-passwall2 luci-i18n-passwall2-zh-cn --force-overwrite
# 8. 验证结果并重启服务
NEW_VER="$(opkg status luci-app-passwall2 2>/dev/null | sed -n 's/^Version: //p')"
if [ -n "$NEW_VER" ]; then
echo "==> 安装成功!当前版本: $NEW_VER"
if [ "$OLD_VER" != "$NEW_VER" ]; then
echo "==> 版本已变更,正在重启服务..."
/etc/init.d/passwall2 restart >/dev/null 2>&1 || true
/etc/init.d/uhttpd restart >/dev/null 2>&1 || true
echo "==> 服务已重启。"
fi
else
echo "!!> 错误: 安装失败。请检查网络或 Feed 地址是否有效。"
echo " 尝试手动执行: opkg install luci-app-passwall2"
fi
echo "==> 完成"
EOF
chmod +x /usr/bin/passwall2-update.sh
/usr/bin/passwall2-update.sh
二合一脚本
cat >/usr/bin/pw-manager.sh <<'EOF'
#!/bin/sh
# 配置区
KEY_URL="https://master.dl.sourceforge.net/project/openwrt-passwall-build/passwall.pub"
LOCKDIR="/tmp/pw-manager.lock"
# 锁定机制
if ! mkdir "$LOCKDIR" 2>/dev/null; then
echo "==> 错误: 脚本已在运行中。"
exit 1
fi
trap 'rmdir "$LOCKDIR" >/dev/null 2>&1' EXIT INT TERM
# 1. 环境识别
. /etc/openwrt_release
ARCH="$DISTRIB_ARCH"
REL_RAW="$DISTRIB_RELEASE"
RELEASE=$(echo "$REL_RAW" | cut -d. -f1-2)
case "$REL_RAW" in
*SNAPSHOT*) FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/snapshots/packages/$ARCH" ;;
*) FEED_BASE="https://master.dl.sourceforge.net/project/openwrt-passwall-build/releases/packages-$RELEASE/$ARCH" ;;
esac
# 2. 核心功能函数
update_feeds() {
echo "==> 正在配置软件源..."
wget -qO /tmp/passwall.pub "$KEY_URL"
opkg-key add /tmp/passwall.pub >/dev/null 2>&1
touch /etc/opkg/customfeeds.conf
sed -i '\|openwrt-passwall-build|d' /etc/opkg/customfeeds.conf
# 添加通用源和特定源
for f in passwall_luci passwall_packages passwall2; do
echo "src/gz $f $FEED_BASE/$f" >> /etc/opkg/customfeeds.conf
done
echo "==> 正在刷新索引 (忽略无关错误)..."
opkg update >/dev/null 2>&1 || true
}
install_pkg() {
pkg_name="$1"
i18n_name="$2"
svc_name="$3"
OLD_VER="$(opkg status $pkg_name 2>/dev/null | sed -n 's/^Version: //p')"
echo "-----------------------------------------------"
echo "==> 准备处理: $pkg_name"
echo "==> 当前版本: ${OLD_VER:-未安装}"
if opkg install $pkg_name $i18n_name --force-overwrite; then
NEW_VER="$(opkg status $pkg_name 2>/dev/null | sed -n 's/^Version: //p')"
echo "==> 安装成功: $NEW_VER"
if [ "$OLD_VER" != "$NEW_VER" ]; then
echo "==> 重启服务: $svc_name"
/etc/init.d/$svc_name restart >/dev/null 2>&1 || true
fi
else
echo "!!> 失败: 无法安装 $pkg_name"
fi
}
# 3. 交互菜单
clear
echo "==============================================="
echo " PassWall 系列自动更新管理工具"
echo " 系统: $REL_RAW | 架构: $ARCH"
echo "==============================================="
echo " 1) 更新 PassWall (经典版)"
echo " 2) 更新 PassWall2 (新版)"
echo " 3) 同时更新两者"
echo " 4) 仅刷新软件源并更新索引"
echo " q) 退出"
echo "-----------------------------------------------"
printf "请输入选项 [1-4/q]: "
read choice
case "$choice" in
1)
update_feeds
install_pkg "luci-app-passwall" "luci-i18n-passwall-zh-cn" "passwall"
;;
2)
update_feeds
install_pkg "luci-app-passwall2" "luci-i18n-passwall2-zh-cn" "passwall2"
;;
3)
update_feeds
install_pkg "luci-app-passwall" "luci-i18n-passwall-zh-cn" "passwall"
install_pkg "luci-app-passwall2" "luci-i18n-passwall2-zh-cn" "passwall2"
;;
4)
update_feeds
echo "==> 软件源已就绪。"
;;
*)
echo "退出。"
exit 0
;;
esac
echo "==============================================="
echo " 所有操作已完成!"
echo "==============================================="
EOF
chmod +x /usr/bin/pw-manager.sh
# 立即运行一次
/usr/bin/pw-manager.sh
评论区