侧边栏壁纸
博主头像
龍騰博客 博主等级

行动起来,活在当下

  • 累计撰写 115 篇文章
  • 累计创建 31 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

2026年最新passwall插件更新安装脚本

管理员
2026-03-30 / 0 评论 / 0 点赞 / 5 阅读 / 0 字

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

0

评论区