Claude Codeで「curl: (56)」が出る原因と対処
Claude Codeのインストール中に出る「curl: (56) Failure writing output to destination」の原因を、接続確認・プロキシ設定・代替インストーラーの3方向で切り分けます。
Claude Codeのインストールコマンド(curl -fsSL https://claude.ai/install.sh | bash)を実行すると、ダウンロードの終盤で処理が止まり「curl: (56) Failure writing output to destination」と表示されることがあります。これはコマンドの書き方が間違っているのではなく、スクリプトのダウンロードが最後まで完了しなかったことを示すエラーです。社内ネットワークやVPN配下、CI環境のように接続経路が複雑な場所ほど遭遇しやすく、原因の大半はネットワーク側にあります。切り分け手順もほぼ1本道で、まず到達性を確認し、結果に応じてプロキシ設定か別のインストール経路に振り分けるだけで済みます。
「curl: (56)」と「curl: (23)」は何を意味しているか
インストールコマンドのcurl ... | bashは、スクリプトをダウンロードしながらBashへパイプで流し込みます。「curl: (56) Failure writing output to destination」は、このダウンロード自体が途中で中断されたことを示すエラー(exit code 56)です。よく似た文言の「curl: (23) Failure writing output to destination」は意味が異なり、curlが受け取った分をBash側にうまく書き込めなかった状態を指します(exit code 23)。多くの場合、Bashのプロセスが早期に終了したことが原因です。
たとえば、ダウンロードの途中でネットワークが瞬断すれば56が、ターミナルを閉じたりCtrl+Cで処理を中断すれば23が出やすくなります。どちらも「Bashがスクリプト全体を受け取れなかった」結果という点は共通しているため、エラー番号だけを見て原因を決め打ちせず、次の接続確認から入るのが近道です。似た症状に「Failed to fetch version from downloads.claude.ai」がありますが、これもdownloads.claude.aiへの到達性が原因なので、対処は共通です。
まず接続を確認する
Claude Codeのバイナリはdownloads.claude.aiから配信されます。インストールをやり直す前に、このホストへ到達できているかを確認します。
curl -sI https://downloads.claude.ai/claude-code-releases/latestWindows PowerShellではcurlがInvoke-WebRequestのエイリアスになっており-sIを受け付けないため、curl.exeを明示的に呼び出します。
curl.exe -sI https://downloads.claude.ai/claude-code-releases/latest1行目に200のステータスが出ていれば(macOS/LinuxはHTTP/2 200、Windows付属curlはHTTP/1.1 200 OK)サーバーには到達できています。この場合、元の失敗は一時的な瞬断だった可能性が高く、インストールコマンドを再実行するだけで通ることがあります。それ以外の結果は、原因を絞り込む手がかりです。
403が返る場合は、プロキシやネットワークフィルターがホストを遮断しているか、利用している地域がサポート対象外であることを意味します。5xxは一時的なサービス障害なので、数分待って再試行すればほとんどの場合通ります。応答がない、Could not resolve host、あるいはタイムアウトになる場合はネットワーク側で接続そのものがブロックされている状態で、典型的な原因は社内ファイアウォールやプロキシによる遮断、地域的なネットワーク制限、システムのCA証明書が古くTLSのハンドシェイクに失敗している、のいずれかです。地域制限が疑われる場合はVPNや別のネットワークからの接続を試すのも切り分けの一つになります。
プロキシ・ファイアウォール環境での対処
社内ネットワークやファイアウォール配下でCould not resolve hostやタイムアウトが出る場合は、HTTPS_PROXYとHTTP_PROXYをプロキシのアドレスに設定してからインストールを実行します。プロキシのURLが分からない場合は社内IT部門に確認するか、ブラウザーのプロキシ設定を参照します。
export HTTP_PROXY=http://proxy.example.com:8080
export HTTPS_PROXY=http://proxy.example.com:8080
curl -fsSL https://claude.ai/install.sh | bashWindowsでは、PowerShellのインストーラーを使う前に同じ変数をセッションへセットします。
$env:HTTP_PROXY = 'http://proxy.example.com:8080'
$env:HTTPS_PROXY = 'http://proxy.example.com:8080'
irm https://claude.ai/install.ps1 | iexプロキシを経由させたくない内部ドメインがある場合は、NO_PROXYにバイパスするホストを列挙すれば、そのドメインへの通信だけプロキシを迂回させられます。ここまで設定しても改善しない場合は、社内CA証明書やmTLSの設定まで踏み込む必要があり、手順は別記事のClaude Codeプロキシ設定にまとめています。
代替インストーラーに切り替える
接続確認で403や恒常的な遮断が確認できた場合、あるいは原因の特定に時間をかけたくない場合は、curl | bash以外のインストール経路に切り替えるのが実務的です。macOSはHomebrew、WindowsはWinGetがそれぞれ別のダウンロード経路を使います。
brew install --cask claude-codewinget install Anthropic.ClaudeCodeインストール後はclaude --versionでバージョン番号(例: 2.1.211 (Claude Code))が表示されるか確認します。「見つからない」と出た場合は、元のインストールを試みたターミナルには古いPATHが残っているため、新しいターミナルを開いてから再確認してください。WinGetはcurlを一切使わない経路なので、Windows環境でcurl: (56)が繰り返し出るなら最初からこちらに切り替えるのが確実です。HomebrewのcaskインストールについてはClaude Code Homebrew・npm・ネイティブ導入の比較、Windowsでの選択肢の全体像はClaude Code Windowsインストールで扱っています。この2つの代替経路は、curl: (56)だけでなくHTMLが返る403エラーやTLS証明書エラーなど、curl | bash経路で起きるほかのダウンロード系トラブル全般でも共通の回避策になります。
使い分け早見表
接続確認コマンドはこのエラー専用の対処ではなく、troubleshoot-installページが挙げるダウンロード系トラブル全般(TLS証明書エラーやバージョン取得失敗)で最初に案内される共通の切り分け手順です。まずここから入れば、curl: (56)以外の症状に当たっていた場合でも手戻りが少なくなります。
| 症状 | 最初に打つ手 |
|---|---|
接続確認が200で戻った | 最初に打つ手一時的な瞬断。インストールコマンドを再実行 |
接続確認が403 | 最初に打つ手地域制限かプロキシ遮断。サポート対象国を確認し、プロキシ環境ならHTTPS_PROXYを設定 |
| 接続確認が応答なし・タイムアウト | 最初に打つ手ネットワークがブロック中。プロキシ設定を試し、改善しなければ代替インストーラーへ |
| プロキシ設定後も同じエラー | 最初に打つ手Homebrew(macOS)かWinGet(Windows)に切り替える |
Dockerビルド中のRUN curl行で止まる | 最初に打つ手RUNの前に接続確認を挟み、ネットワーク遮断かDockerfile側の問題かを切り分ける |
この早見表はエラーメッセージから対処へ最短で移るためのものであり、原因の確定は必ず接続確認コマンドの結果を見てから行ってください。症状が複数当てはまる場合も、上から順に1つずつ試していけば、無駄な手戻りを避けられます。
この切り分けがCI・自動化環境で効く理由
curl: (56)とcurl: (23)は、どちらも「Bashが完全なスクリプトを受け取れなかった」という同じ結果を指すため、ログだけを見て機械的にリトライを組むと、瞬断と恒常的な遮断を区別できないままリトライを繰り返すことになります。CIランナーやDockerイメージのビルドでインストールを自動化しているなら、接続確認コマンドを先に走らせてステータスコードで分岐させたほうが、無駄なリトライを重ねるより早く原因にたどり着けます。恒常的に403やタイムアウトが出る環境ではそもそもcurl | bashをリトライさせず、最初からHomebrewやWinGetのような別経路をインストール手順に組み込んでおくほうが安定した選択です。
DockerfileでビルドイメージにClaude Codeを組み込む場合も、RUN curl -fsSL https://claude.ai/install.sh | bashという同じインストールコマンドを使います。そのためビルド環境のネットワークが遮断されていれば、ローカル端末と同じcurl: (56)やcurl: (23)に直面します。Dockerのビルドがこの行で止まる場合は、まずRUN命令の前に接続確認コマンドを挟み、ホスト側のネットワーク設定が原因なのか、Dockerfileの書き方自体の問題(たとえばルート直下での作業によるハング)なのかを切り分けてください。
まとめ
「curl: (56)」も「curl: (23)」も、原因を決め打ちせずまずcurl -sI https://downloads.claude.ai/claude-code-releases/latestで接続を確認するところから始めます。200が返れば一時的な瞬断なので再試行、403やタイムアウトが返ればプロキシ設定か代替インストーラーへの切り替えが最短経路です。インストール全体のエラーを広く切り分けたい場合はClaude Codeインストールエラーの切り分けチェックリストも合わせて確認してください。CI・Docker環境で自動化している場合は、接続確認をパイプラインの前段に組み込んでおくと、瞬断と恒常的な遮断の切り分けにかかる時間を短縮できます。社内CA証明書やmTLSまで踏み込む必要がある恒常的なプロキシ環境では、都度の環境変数設定より恒久設定のほうが手間が少なく済みます。
このエラーの厄介なところは、メッセージ自体が「なぜ止まったか」を教えてくれない点です。curlはネットワークの状態を知らないまま、ただ書き込みに失敗したことだけを報告します。だからこそ、エラー文言をそのまま検索エンジンに投げるより先に、接続確認という1つのコマンドで状況を切り分けるほうが、結果的に早く解決へたどり着けます。