#!/usr/bin/env bash # 本地根据 .env 渲染客户端配置(无需在 VPS 上运行) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ROOT_DIR="$(dirname "$SCRIPT_DIR")" ENV_FILE="${ROOT_DIR}/.env" OUT_DIR="${ROOT_DIR}/client/generated" [[ -f "$ENV_FILE" ]] || { echo "缺少 .env,请先 cp .env.example .env 并填写"; exit 1; } # shellcheck disable=SC1090 source "$ENV_FILE" for var in VPS_IP DOMAIN UUID REALITY_SERVER_NAME REALITY_PUBLIC_KEY REALITY_SHORT_ID HY2_PASSWORD; do [[ -n "${!var:-}" ]] || { echo "缺少 .env 变量: $var"; exit 1; } done mkdir -p "$OUT_DIR" urlencode() { python3 -c "import sys, urllib.parse; print(urllib.parse.quote(sys.argv[1], safe='').replace('.', '%2E'))" "$1" } REALITY_SNI_ENC="$(urlencode "$REALITY_SERVER_NAME")" REALITY_PBK_ENC="$(urlencode "$REALITY_PUBLIC_KEY")" REALITY_SID_ENC="$(urlencode "$REALITY_SHORT_ID")" HY2_PASSWORD_ENC="$(urlencode "$HY2_PASSWORD")" DOMAIN_SNI_ENC="$(urlencode "$DOMAIN")" sed -e "s|\${VPS_IP}|${VPS_IP}|g" \ -e "s|\${DOMAIN}|${DOMAIN}|g" \ -e "s|\${UUID}|${UUID}|g" \ -e "s|\${REALITY_SERVER_NAME}|${REALITY_SERVER_NAME}|g" \ -e "s|\${REALITY_PUBLIC_KEY}|${REALITY_PUBLIC_KEY}|g" \ -e "s|\${REALITY_SHORT_ID}|${REALITY_SHORT_ID}|g" \ -e "s|\${HY2_PASSWORD}|${HY2_PASSWORD}|g" \ "$ROOT_DIR/client/sing-box-client.json.template" > "$OUT_DIR/sing-box-client.json" cat > "$OUT_DIR/share-links.txt" <