Claude Codeを起動し直すと、Please run /login または 401 OAuth access token has been revoked が表示され、その後の指示に応答しなくなる状態が複数のセッションで繰り返し発生しました。/login で一度復旧しても、新しく起動したClaude Codeで再発するため、常駐セッションを継続して使えませんでした。
この記事でできること
- Claude Code が起動時に
/loginを要求するときの切り分けができる - 「設定ファイルを直したのに直らない」ときに、次にどこを見ればいいかがわかる
- 開きっぱなしのshellが子プロセスへ渡す値と、プロセスの起動時に渡された環境変数を安全に確認できる
環境
- 認証はOAuthで、複数のClaude Codeが同じ保存済みOAuth資格情報を参照していた
- 対話型・非ログインのbashが読む
~/.bashrcにCLAUDE_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に古いトークンが残っていました。
対話型・非ログインのbashが起動時に読む
shell 起動時に読み込む
設定ファイルを直した後も古い値を保持
子プロセスへ継承
古いトークンで認証を試みる
今回使っていた対話型・非ログインの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には古い値が残ります。次の順で処理します。
- tmuxのグローバル環境と対象セッションの環境から変数を削除する
- 既存のtmux内のshellで
unset CLAUDE_CODE_OAUTH_TOKENを実行するか、windowまたはpaneを作り直す - その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 で公開しています。本棚をシンプルに管理したい方はぜひ。
関連記事
- tmux + Tailscale + Termius でスマホから Claude Code を動かす最短手順【母艦ハブ型・2026年版】
- Claude Code 同士が相談しながら開発したら10人チームが3日で自然発生した話【Hub-Worker 構成公開・2026年版】
- ブログ更新を Claude Code で自動化する仕組み【テーマ選定・画像・週次 cron の試行錯誤を全部書く】
参考
- Claude Code Docs — Authentication(認証方式の優先順位)
- Bash Reference Manual — Bash Startup Files(
~/.bashrcを読む条件) - tmux(1) — Linux manual page(
set-environment/show-environment) - proc_pid_environ(5) — Linux manual page(
/proc/[pid]/environ)
0 件のコメント:
コメントを投稿