fix: check-members.sh适配Docker环境+修复IFS解析

This commit is contained in:
2026-06-02 10:39:07 +08:00
parent 2470f4265b
commit bf461a8bcc

View File

@@ -40,13 +40,36 @@ while [[ $# -gt 0 ]]; do
esac
done
# ---- 获取 SSH 配置 ----
# ---- 获取 SSH 和数据库配置 ----
SSH_HOST=$(grep '^SSH_SERVER=' "$ENV_FILE" 2>/dev/null | head -1 | cut -d'=' -f2- | tr -d '"' | tr -d "'" | xargs)
if [ -z "$SSH_HOST" ]; then
echo "${RED}❌ 未找到 SSH_SERVER 配置,请检查 $ENV_FILE${NC}"
exit 1
fi
# 从 DATABASE_URL 解析数据库连接参数
DB_URL=$(grep '^DATABASE_URL=' "$ENV_FILE" 2>/dev/null | head -1 | cut -d'=' -f2- | tr -d '"' | tr -d "'" | xargs)
# 提取用户名:密码:主机:端口
DB_USER=$(echo "$DB_URL" | sed 's|.*://\([^:]*\):.*|\1|')
DB_PASS=$(echo "$DB_URL" | sed 's|.*://[^:]*:\([^@]*\)@.*|\1|')
DB_HOST=$(echo "$DB_URL" | sed 's|.*@\([^:]*\):.*|\1|')
DB_PORT=$(echo "$DB_URL" | sed 's|.*:\([0-9]*\)/.*|\1|')
# 拼接目标数据库的连接串
TARGET_URL="postgres://${DB_USER}:${DB_PASS}@127.0.0.1:${DB_PORT}/${DB_NAME}"
# PSQL 执行函数:通过 docker exec服务器上 psql 在容器内)
psql_exec() {
local sql="$1"
local result
result=$(ssh "$SSH_HOST" "docker exec 1Panel-postgresql-FtMo psql '$TARGET_URL' -At -c \"$sql\" 2>/dev/null" 2>/dev/null)
if [ -z "$result" ]; then
result=$(ssh "$SSH_HOST" "psql -d $DB_NAME -At -c \"$sql\" 2>/dev/null" 2>/dev/null)
fi
# 去掉末尾空行
echo "$result" | sed '/^$/d'
}
echo -e "${CYAN}══════════════════════════════════════${NC}"
echo -e "${CYAN} 会员订阅状态检查${NC}"
echo -e "${CYAN} 数据库: ${BOLD}$DB_NAME${NC}"
@@ -74,8 +97,9 @@ FROM users;
SQL
)
OVERVIEW=$(ssh "$SSH_HOST" "psql -d $DB_NAME -At -c \"$SQL_OVERVIEW\"" 2>/dev/null) || {
echo -e "${RED}SSH 连接失败: $SSH_HOST${NC}"
OVERVIEW=$(psql_exec "$SQL_OVERVIEW") || {
echo -e "${RED}数据库查询失败 (SSH: $SSH_HOST, DB: $DB_NAME)${NC}"
echo -e "${YELLOW} 尝试直接连接: ssh $SSH_HOST docker exec 1Panel-postgresql-FtMo psql ...${NC}"
exit 1
}
@@ -106,7 +130,7 @@ ORDER BY
SQL
)
MEMBER_LIST=$(ssh "$SSH_HOST" "psql -d $DB_NAME -AqtF'|' -c \"$SQL_LIST\"" 2>/dev/null)
MEMBER_LIST=$(psql_exec "$SQL_LIST")
# ---- 近期到期的活跃会员 ----
SQL_EXPIRING=$(cat <<'SQL'
@@ -124,7 +148,7 @@ ORDER BY membership_expires_at;
SQL
)
EXPIRING_LIST=$(ssh "$SSH_HOST" "psql -d $DB_NAME -AqtF'|' -c \"$SQL_EXPIRING\"" 2>/dev/null)
EXPIRING_LIST=$(psql_exec "$SQL_EXPIRING")
# ---- JSON 输出 ----
if [ "$OUTPUT_JSON" = true ]; then