1Panel自动更新脚本上新(支持MFA)

本升级脚本调用的是1panel自身的更新API,安全升级有保障

  1. 在1panel面板中添加计划任务,建议为每日的凌晨(当然你隔1分钟检查一次我也没意见)。
  2. 任务类型选择 Shell 脚本
  3. 填入如下脚本,在对应位置填入你的1panel登录密码和MFA 秘钥(如果有,而且需要系统中安装oathtool)。
#!/bin/bash

PASSWORD=""     # 请修改为你的 1panel 密码
MFA_SECRET=""   # 若开启了 MFA,请填写你的 MFA 秘钥,运行前请确保已安装 oathtool

# 请勿修改以下内容
# 请勿修改以下内容
# 请勿修改以下内容

# 如果设置了 MFA_SECRET,检查是否安装了 oathtool
if [ -n "$MFA_SECRET" ] && ! command -v oathtool &> /dev/null; then
    echo "MFA_SECRET 已设置,但未找到 oathtool,请安装 oathtool 后再运行脚本。"
    exit 1
fi

if [ -z "$PASSWORD" ]; then
    echo "请修改脚本中的 PASSWORD 变量"
    exit 1
fi

# 获取面板地址和用户名
USER_INFO=$(1pctl user-info)
BASE_URL=$(echo "$USER_INFO" | grep "面板地址:" | awk '{print $2}' | sed 's:/$::')
BASE_URL=$(echo "$BASE_URL" | sed -E 's#(http://|https://)([^:/]+|\\$LOCAL_IP)#\1127.0.0.1#')
ENTRANCECODE=""

# 处理安全入口
if echo "$BASE_URL" | grep -q "^[^/]*//[^/]*/"
then
    ENTRANCECODE=$(echo "$BASE_URL" | sed -E 's#^[^/]*//[^/]*/([^/]+).*#\1#')
    BASE_URL=$(echo "$BASE_URL" | sed -E 's#^(([^/]*/+){3})[^/]+.*#\1#' | sed 's:/$::')
fi

USERNAME=$(echo "$USER_INFO" | grep "面板用户:" | awk '{print $2}')

ENTRANCECODE=$(echo -n "$ENTRANCECODE" | base64)

if [ -z "$BASE_URL" ] || [ -z "$USERNAME" ]; then
    echo "无法获取面板地址或用户名,请检查 1pctl 命令是否可用"
    exit 1
fi

COOKIE_FILE=$(mktemp)

# 如果设置了 MFA 秘钥,则生成临时验证码
if [ -n "$MFA_SECRET" ]; then
    MFA_CODE=$(oathtool --totp -b "$MFA_SECRET")
    echo "生成的 MFA 验证码:$MFA_CODE"
    # 使用 MFA 登录
    LOGIN_RESPONSE=$(curl -k -s --location --request POST "$BASE_URL/api/v1/auth/mfalogin" \
    --header "entrancecode: $ENTRANCECODE" \
    --data-raw '{
        "name": "'"$USERNAME"'",
        "password": "'"$PASSWORD"'",
        "secret": "",
        "code": "'"$MFA_CODE"'",
        "authMethod": "session"
    }' --cookie-jar $COOKIE_FILE)
else
    # 普通登录
    LOGIN_RESPONSE=$(curl -k -s --location --request POST "$BASE_URL/api/v1/auth/login" \
    --header "entrancecode: $ENTRANCECODE" \
    --data-raw '{
        "authMethod": "session",
        "captcha": "",
        "captchaID": "",
        "ignoreCaptcha": true,
        "language": "zh",
        "name": "'"$USERNAME"'",
        "password": "'"$PASSWORD"'"
    }' --cookie-jar $COOKIE_FILE)
fi

CODE=$(echo "$LOGIN_RESPONSE" | grep -o '"code":[0-9]*' | awk -F':' '{print $2}')

if [ "$CODE" != "200" ]; then
    echo "登录失败,请检查密码或 MFA 码是否正确"
    rm $COOKIE_FILE -f
    exit 1
fi

# 检查更新
UPGRADE_RESPONSE=$(curl -k -s --request GET "$BASE_URL/api/v1/settings/upgrade" --cookie $COOKIE_FILE \
--header "entrancecode: $ENTRANCECODE")

CODE=$(echo "$UPGRADE_RESPONSE" | grep -o '"code":[0-9]*' | awk -F':' '{print $2}')
TEST_VERSION=$(echo "$UPGRADE_RESPONSE" | grep -o '"testVersion":"[^"]*' | sed 's/"testVersion":"//')
NEW_VERSION=$(echo "$UPGRADE_RESPONSE" | grep -o '"newVersion":"[^"]*' | sed 's/"newVersion":"//')
LATEST_VERSION=$(echo "$UPGRADE_RESPONSE" | grep -o '"latestVersion":"[^"]*' | sed 's/"latestVersion":"//')

if [ "$CODE" == "200" ]; then
    if [ -n "$TEST_VERSION" ]; then
        VERSION_TO_UPDATE="$TEST_VERSION"
    elif [ -n "$LATEST_VERSION" ]; then
        VERSION_TO_UPDATE="$LATEST_VERSION"
    elif [ -n "$NEW_VERSION" ]; then
        VERSION_TO_UPDATE="$NEW_VERSION"
    else
        echo "无更新可用"
        rm $COOKIE_FILE -f
        exit 0
    fi

    echo "有更新可用,最新版本号:$VERSION_TO_UPDATE,正在更新..."
    UPDATE_RESPONSE=$(curl -k -s --location --request POST "$BASE_URL/api/v1/settings/upgrade" \
    --header "entrancecode: $ENTRANCECODE" \
    --data-raw '{
        "version": "'"$VERSION_TO_UPDATE"'"
    }' --cookie $COOKIE_FILE)
    UPDATE_CODE=$(echo "$UPDATE_RESPONSE" | grep -o '"code":[0-9]*' | awk -F':' '{print $2}')
    if [ "$UPDATE_CODE" == "200" ]; then
        echo "升级成功"
    else
        echo "升级失败"
    fi
else
    echo "检查更新失败"
fi

rm $COOKIE_FILE -f

牛皮!支持!

邪魔外道方式飞机:

1Panel自动升级脚本,适用于自动检测升级并发送通知