diff --git a/scripts/check-members.sh b/scripts/check-members.sh index 91d3f39..16677c1 100755 --- a/scripts/check-members.sh +++ b/scripts/check-members.sh @@ -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