CopyButton

2026年8月11日火曜日

Claude Codeを起動し直すと /login を求められる原因と対処【2026年版】

Claude Codeを起動し直すと、Please run /login または 401 OAuth access token has been revoked が表示され、その後の指示に応答しなくなる状態が複数のセッションで繰り返し発生しました。/login で一度復旧しても、新しく起動したClaude Codeで再発するため、常駐セッションを継続して使えませんでした。

色鉛筆で描いた、shellからClaude Codeへ渡る途中で認証トークンが壊れて失われるイメージ

この記事でできること

  • Claude Code が起動時に /login を要求するときの切り分けができる
  • 「設定ファイルを直したのに直らない」ときに、次にどこを見ればいいかがわかる
  • 開きっぱなしのshellが子プロセスへ渡す値と、プロセスの起動時に渡された環境変数を安全に確認できる

環境

  • 認証はOAuthで、複数のClaude Codeが同じ保存済みOAuth資格情報を参照していた
  • 対話型・非ログインのbashが読む ~/.bashrcCLAUDE_CODE_OAUTH_TOKEN を固定値で export していた
  • その環境変数を読み込んだshellを終了せず、そこからClaude Codeを繰り返し起動していた

再発した条件

今回401認証エラーを再現した条件は、古いトークンを保持するshellからClaude Codeの新規プロセスを起動することでした。

別のターミナルで /login しても、問題のshellが保持する環境変数は更新されません。すでに起動しているプロセスも、起動時に渡された環境変数を引き続き持ちます。

原因調査

原因の特定には約1か月かかりました。その間に、次の4点を順に確認しました。

確認内容 操作 結果・判断
別のセッションでの /login が既存セッションに影響するか 別セッションで /login する前後の動作を比較 関連は確認できなかった
複数プロセスの同時起動で、リフレッシュトークンの更新が競合するか 複数を同時に起動せず、1つずつ順番に起動 401認証エラーが続いたため、同時起動は原因ではなかった
共有する保存済みOAuth資格情報の更新が、新規プロセスにも反映されるか 1つのClaude Codeで /login した後、別のClaude Codeを新しく起動 新規プロセスは401認証エラーになり、保存済みOAuth資格情報とは別の認証経路が使われている可能性が残った
401認証エラーになったプロセスを個別に復旧できるか 当該プロセスで /login を実行 そのプロセスだけは復旧したが、同じshellから新しく起動したClaude Codeでは再発した

原因:古いトークンの環境変数が保存済みOAuth資格情報より優先されていた

環境変数を確認すると、起動元のshellに古いトークンが残っていました。

~/.bashrc
対話型・非ログインのbashが起動時に読む

shell 起動時に読み込む
開きっぱなしの shell
設定ファイルを直した後も古い値を保持

子プロセスへ継承
Claude Code
古いトークンで認証を試みる

今回使っていた対話型・非ログインのbashは、起動時に ~/.bashrc を読みます。あとから export を削除しても、すでに開いているshellの環境は変わりません。そこからClaude Codeを起動するたびに、古いトークンが子プロセスへ渡されていました。

古い CLAUDE_CODE_OAUTH_TOKEN が、/login による保存済みOAuth資格情報より優先されたことが原因です。Claude Codeの公式ドキュメントでも、この環境変数は保存済みOAuth資格情報より優先されると説明されています。起動元のshellに古い値が残っていれば、そちらが使われます。

このため、同じshellから新しく起動したClaude Codeは毎回古いトークンを継承し、401認証エラーになっていました。

解消手順:シェル設定ファイル・現在のshell・Claude Code

シェル設定ファイルを直すだけでは、すでに開いているshellとClaude Codeに残った値は消えません。次の3段階を順に解消します。

対象 操作 この操作だけでは変わらない対象
1. シェル設定ファイル 今回の環境では ~/.bashrc にある export を削除/コメントアウト 現在のshell・起動済みプロセスには反映されない
2. 現在のshell unset CLAUDE_CODE_OAUTH_TOKENを実行する。shellを作り直す場合は、古い値を持たない環境から起動する 起動済みプロセスには反映されない
3. 起動済みの Claude Code 古い値を削除したshellから対象プロセスを起動し直す なし

確認に使ったコマンド

# 現在の shell に残っているか
$ env | cut -d= -f1 | grep -c '^CLAUDE_CODE_OAUTH_TOKEN$'
0

# 起動済みプロセスに起動時に渡された環境変数
$ tr '\0' '\n' < /proc/<pid>/environ | grep -c '^CLAUDE_CODE_OAUTH_TOKEN='
0

どちらも件数だけを数えています。ヒット行をそのまま出すと 変数名=値 の形でトークンが画面に出てしまうためです。

/proc/<pid>/environで確認できるのは、原則としてプロセスの起動時に渡された初期環境です。プロセスが起動後に環境変数を書き換えても反映されないため、ここではClaude Codeが古い値を継承して起動したかどうかの確認にだけ使います。

結果

シェル設定ファイルから export を削除し、古い値を持たないshellからClaude Codeを起動すると、個別の /login なしで認証に成功しました。

補足:tmuxを使う場合の追加手順

tmuxを使う場合の要点は、tmuxがグローバル環境とセッション環境を持ち、新しいwindowを作るときに両方を統合してプロセスへ渡すことです。同じ変数が両方にあれば、セッション環境の値が使われます。

環境変数の継承経路は、次のようになります。

tmuxのグローバル環境・セッション環境 → tmux内のshell → Claude Code

tmuxに残る環境変数の削除手順

今回、古いトークンはグローバル環境に残っていました。tmuxにはセッション環境もあるため、削除前に両方を確認します。

# tmuxサーバに残っているか(値は表示しない)
$ tmux show-environment -g | cut -d= -f1 | grep -c '^CLAUDE_CODE_OAUTH_TOKEN$'

# 対象セッションにも残っているか(値は表示しない)
$ tmux show-environment -t <session-name> | cut -d= -f1 | grep -c '^CLAUDE_CODE_OAUTH_TOKEN$'

# tmuxサーバから削除する
$ tmux setenv -gu CLAUDE_CODE_OAUTH_TOKEN

# 対象セッションから削除する
$ tmux setenv -u -t <session-name> CLAUDE_CODE_OAUTH_TOKEN

tmuxの環境から削除しても、既存のwindowやpaneで動いているshellとClaude Codeには古い値が残ります。次の順で処理します。

  1. tmuxのグローバル環境と対象セッションの環境から変数を削除する
  2. 既存のtmux内のshellで unset CLAUDE_CODE_OAUTH_TOKEN を実行するか、windowまたはpaneを作り直す
  3. そのshellからClaude Codeを起動し直す

全セッションを終了できる場合は、tmux kill-serverでtmuxサーバ、既存のshell、Claude Codeをまとめて終了できます。今回の環境では、作業中の1セッションを除く14セッションを起動し直し、14セッションすべてで個別の /login なしに認証できました。残る1セッションも後から起動し直し、古い環境変数がないことを確認しました。

tmuxセッションを外から監視する場合

今回の環境では、tmuxセッションの外からClaude Codeプロセスの有無を監視していました。401認証エラーの後もプロセス自体は終了しなかったため、プロセスの存在確認だけでは応答停止を検出できませんでした。

※本記事は執筆時点(2026 年 8 月)のWSL2環境での実測にもとづく記録です。shellやクライアント側の挙動はバージョン・起動方法によって変わる場合があります。気付いた点があればコメント欄でお知らせください。

まとめ

  • 401認証エラーの原因は、shellに残っていた古い CLAUDE_CODE_OAUTH_TOKEN が、/login で保存されたOAuth資格情報より優先されたことでした
  • 解消には、~/.bashrcから設定を削除し、現在のshellから環境変数を消したうえで、そのshellからClaude Codeを起動し直す必要がありました
  • tmuxを使う場合は、グローバル環境とセッション環境からも変数を削除し、既存のshellに残る値にも対処します

この記事が役に立ったらX(Twitter)でシェアしてもらえると喜びます。

このブログを書いた人のアプリ

本ブログの著者が作った iOS 読書管理アプリ わたしのほんやさん を App Store で公開しています。本棚をシンプルに管理したい方はぜひ。

App Store で見る →

関連記事

参考

0 件のコメント:

コメントを投稿