#!/usr/bin/env bash # gen-poc-config.sh — 渲染 REALITY 客户端 PoC 配置(tsk_SLCsjNgtmng3) # # 用法: ./gen-poc-config.sh [--out ] # # 从环境变量读取参数(须全部提供,无 --干跑 模式): # SERVER_HOST EC2 IP(如 18.136.60.128) # SERVER_PORT Xray VLESS 监听端口(如 11443) # REALITY_UUID 客户端 UUID # REALITY_PUBLIC_KEY REALITY 公钥 # REALITY_SHORT_ID REALITY shortId # REALITY_SNI TLS SNI(如 www.apple.com) # # 可选: # CLASH_API_PORT Clash API 端口(默认随机 49152-65535) # CLASH_API_SECRET Clash API secret(默认随机 32 字节 hex) # # 产物默认写到 /tmp/pangolin-poc-config.json(权限 0600)。 # # 注意:REALITY 私钥等参数绝不入库,仅在运行时从 EC2 secrets/ 或 Bitwarden 取。 set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" TMPL="${SCRIPT_DIR}/reality_client.config.json.tmpl" OUT="${1:---out}" if [[ "${OUT}" == "--out" ]]; then OUT="${2:-/tmp/pangolin-poc-config.json}" shift 2 2>/dev/null || true fi # ── 参数检查 ────────────────────────────────────────────────────── _require() { local name="$1" if [[ -z "${!name:-}" ]]; then printf '✗ 环境变量 %s 未设置\n' "$name" >&2 printf ' 示例: export %s=\n' "$name" >&2 exit 1 fi } _require SERVER_HOST _require SERVER_PORT _require REALITY_UUID _require REALITY_PUBLIC_KEY _require REALITY_SHORT_ID REALITY_SNI="${REALITY_SNI:-www.apple.com}" # 生成随机 Clash API 端口和 secret(若未指定) if [[ -z "${CLASH_API_PORT:-}" ]]; then CLASH_API_PORT="$(python3 -c 'import random; print(random.randint(49152,65535))')" fi if [[ -z "${CLASH_API_SECRET:-}" ]]; then CLASH_API_SECRET="$(python3 -c 'import secrets; print(secrets.token_hex(32))')" fi # ── 渲染模板 ────────────────────────────────────────────────────── printf '==> 渲染配置 → %s\n' "$OUT" sed \ -e "s|__SERVER_HOST__|${SERVER_HOST}|g" \ -e "s|__SERVER_PORT__|${SERVER_PORT}|g" \ -e "s|__UUID__|${REALITY_UUID}|g" \ -e "s|__REALITY_PUBLIC_KEY__|${REALITY_PUBLIC_KEY}|g" \ -e "s|__REALITY_SHORT_ID__|${REALITY_SHORT_ID}|g" \ -e "s|__REALITY_SNI__|${REALITY_SNI}|g" \ -e "s|__CLASH_API_PORT__|${CLASH_API_PORT}|g" \ -e "s|__CLASH_API_SECRET__|${CLASH_API_SECRET}|g" \ "${TMPL}" > "${OUT}" chmod 600 "${OUT}" printf '✓ 已写入: %s\n' "$OUT" printf ' Clash API: http://127.0.0.1:%s (secret len=%d)\n' \ "$CLASH_API_PORT" "${#CLASH_API_SECRET}" printf ' Server: %s:%s\n' "$SERVER_HOST" "$SERVER_PORT" printf '\n提示: 使用此配置测试前,请确认 sing-box 有 TUN 权限:\n' printf ' sudo sh -c "echo \"%%(whoami)s ALL=(root) NOPASSWD: /path/to/sing-box\" >> /etc/sudoers.d/pangolin"\n'