本升级脚本调用的是1panel自身的更新API,安全升级有保障
- 在1panel面板中添加计划任务,建议为每日的凌晨(当然你隔1分钟检查一次我也没意见)。
- 任务类型选择
Shell 脚本
。 - 填入如下脚本,在对应位置填入你的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