claude-credentials-path.ts is imported by token-refresh/claude-usage/ agent-runner-environment/runtime-inventory; committed tree already depends on it. claude_relogin.sh is referenced by token-refresh.ts as the manual recovery step; codex_relogin.sh mirrors the Codex re-auth runbook. Drop stray empty .codex file. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
106 lines
4.0 KiB
Bash
Executable File
106 lines
4.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
#
|
|
# claude_relogin.sh — 이 폴더의 Claude 계정을 OAuth로 재로그인한다.
|
|
#
|
|
# 사용법:
|
|
# ./claude_relogin.sh
|
|
#
|
|
# 동작:
|
|
# 1) 이 스크립트가 있는 폴더의 .env 에서 CLAUDE_CREDENTIALS_PATH 를 읽어온다.
|
|
# 2) 인증(authorize) URL 을 출력한다 → 브라우저로 열어 로그인한다.
|
|
# 3) 로그인 완료 후 화면에 나오는 코드를 붙여넣는다.
|
|
# 4) 코드를 토큰으로 교환해 credentials 파일에 저장한다.
|
|
# 5) 해당 systemd(--user) 서비스를 재시작한다.
|
|
#
|
|
set -euo pipefail
|
|
|
|
# --- 이 스크립트가 있는 폴더로 이동 ---------------------------------------
|
|
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
cd "$DIR"
|
|
|
|
# --- bun 실행 파일 찾기 ----------------------------------------------------
|
|
BUN="$(command -v bun 2>/dev/null || true)"
|
|
[ -z "$BUN" ] && [ -x "$HOME/.bun/bin/bun" ] && BUN="$HOME/.bun/bin/bun"
|
|
if [ -z "$BUN" ]; then
|
|
echo "❌ bun 을 찾을 수 없습니다. PATH 를 확인하세요." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- .env 에서 CLAUDE_CREDENTIALS_PATH 읽기 --------------------------------
|
|
if [ ! -f .env ]; then
|
|
echo "❌ $DIR/.env 가 없습니다." >&2
|
|
exit 1
|
|
fi
|
|
CRED_PATH="$(grep -E '^CLAUDE_CREDENTIALS_PATH=' .env | tail -n1 | cut -d= -f2- | tr -d '"'"'"'' )"
|
|
if [ -z "${CRED_PATH:-}" ]; then
|
|
echo "❌ .env 에 CLAUDE_CREDENTIALS_PATH 가 설정되어 있지 않습니다." >&2
|
|
exit 1
|
|
fi
|
|
export CLAUDE_CREDENTIALS_PATH="$CRED_PATH"
|
|
|
|
# --- 서비스명 자동 감지 (폴더명 소문자 + .service) -------------------------
|
|
SERVICE="$(basename "$DIR" | tr '[:upper:]' '[:lower:]').service"
|
|
|
|
echo "======================================================================"
|
|
echo " Claude 재로그인"
|
|
echo " 폴더 : $DIR"
|
|
echo " credentials : $CLAUDE_CREDENTIALS_PATH"
|
|
echo " 서비스 : $SERVICE"
|
|
echo "======================================================================"
|
|
echo
|
|
|
|
# --- 1단계: authorize URL 발급 --------------------------------------------
|
|
echo "▶ 1단계: 로그인 URL 생성 중..."
|
|
PHASE1_OUT="$("$BUN" setup/index.ts --step login 2>/dev/null)"
|
|
URL="$(printf '%s\n' "$PHASE1_OUT" | grep -E '^AUTHORIZE_URL=' | head -n1 | sed 's/^AUTHORIZE_URL=//')"
|
|
if [ -z "$URL" ]; then
|
|
echo "❌ 인증 URL 생성 실패. 출력:" >&2
|
|
printf '%s\n' "$PHASE1_OUT" >&2
|
|
exit 1
|
|
fi
|
|
|
|
echo
|
|
echo "▼ 아래 URL 을 브라우저에서 열어 로그인하세요:"
|
|
echo "----------------------------------------------------------------------"
|
|
echo "$URL"
|
|
echo "----------------------------------------------------------------------"
|
|
echo
|
|
echo "로그인 완료 후 화면에 표시되는 코드를 복사하세요."
|
|
echo "(코드는 'xxxx' 또는 'xxxx#yyyy' 형태 모두 가능합니다.)"
|
|
echo
|
|
|
|
# --- 코드 입력 받기 --------------------------------------------------------
|
|
printf "붙여넣을 코드: "
|
|
read -r CODE
|
|
CODE="$(printf '%s' "$CODE" | tr -d '[:space:]')"
|
|
if [ -z "$CODE" ]; then
|
|
echo "❌ 코드가 비어 있습니다. 중단합니다." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- 2단계: 코드 → 토큰 교환 ----------------------------------------------
|
|
echo
|
|
echo "▶ 2단계: 코드 교환 및 credentials 저장 중..."
|
|
if "$BUN" setup/index.ts --step login --code "$CODE"; then
|
|
echo "✅ 로그인 성공 — credentials 저장 완료: $CLAUDE_CREDENTIALS_PATH"
|
|
else
|
|
echo "❌ 코드 교환 실패. 코드가 만료되었거나 잘못되었을 수 있습니다." >&2
|
|
echo " 스크립트를 다시 실행해 새 URL 로 시도하세요." >&2
|
|
exit 1
|
|
fi
|
|
|
|
# --- 3단계: 서비스 재시작 --------------------------------------------------
|
|
echo
|
|
echo "▶ 3단계: $SERVICE 재시작..."
|
|
if systemctl --user restart "$SERVICE" 2>/dev/null; then
|
|
sleep 1
|
|
STATE="$(systemctl --user is-active "$SERVICE" 2>/dev/null || true)"
|
|
echo "✅ $SERVICE 상태: $STATE"
|
|
else
|
|
echo "⚠ $SERVICE 재시작을 건너뜀(서비스가 없거나 권한 없음). 수동으로 재시작하세요:" >&2
|
|
echo " systemctl --user restart $SERVICE" >&2
|
|
fi
|
|
|
|
echo
|
|
echo "완료. 🎉"
|