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」と表示されて止まることがあります。コマンドの書き方の誤りではありません。curlが受け取ったスクリプトがBashに最後まで渡らなかった、という報告です。
対処は、まずdownloads.claude.aiに届くかを1コマンドで確かめ、その結果で分けるだけです。ただし、届かない原因が「ホストの遮断」のときは、代替インストーラーに替えても直らないことがあります。どこで分かれるかを、症状の側から順にたどります。
「curl: (56)」と「curl: (23)」は何が違うか
インストールコマンドのcurl ... | bashは、スクリプトをダウンロードしながらBashへパイプで流し込みます。このとき2つの終了コードがよく似た文言で出ます。
終了コード56と23の違い
56
公式はダウンロード自体が途中で中断された状態と説明しています。文言は「curl: (56) Failure writing output to destination」です。
23
curlが受け取ったデータをパイプへ書き込めなかった状態です。多くはBashが先に終了したことが原因で、ネットワークとは限りません。
どちらも「Bashがスクリプト全体を受け取れなかった」点は同じなので、番号だけで原因を決め打ちせず、次の接続確認から入ります。
23の出方は、手元で再現できます。ネットワークを使わず、ローカルのファイルをcurlで読み、10バイトだけ読んで終了するコマンドへパイプします。読み手が先に終わる状況を作るだけの実験です。
seq 1 200000 > big.txt
curl -sS file://$PWD/big.txt | head -c 10 > /dev/nullcurl: (23) Failure writing output to destination, passed 16384 returned 0パイプの読み手が先に終わると、curlは23で失敗します。末尾の「passed 16384 returned 0」の部分は、手元のcurlのバージョンで出た表示です。バージョンによって文言が違う可能性があります。
同じ実験をHTTPS(HTTP/2)のURLで行うと、番号が変わります。
curl -sS https://code.claude.com/docs/en/troubleshoot-install.md | head -c 10 > /dev/nullcurl: (56) Failure writing output to destination, passed 51 returned 0終了コードも56です。ネットワークは切れておらず、パイプの読み手が先に閉じただけです。同じ「読み手が先に終わる」状況でも、file://では23、HTTP/2の転送中は56になりました(手元のcurl 8.7.1で確認)。56だからといって回線の切断とは限りません。
接続確認の結果で分ける
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)。200以外や応答なしの場合は、次のように分かれます。
接続確認の結果から次の一手を選ぶ
- 1
200 が返る
一時的な失敗として、インストールコマンドを再実行します。
- 2
403 が返る
多くは、プロキシやネットワークフィルターがホストを遮断しているか、利用地域がサポート対象外です。
見分けは、インストールコマンドを実行したときの出力です。
<!DOCTYPE html>付近でBashのsyntax errorが出て、返ってきたHTMLページに「App unavailable in region」とあれば、利用できない国からの接続です。curl: (22) The requested URL returned error: 403だけで本文がない場合も同じ原因のことがありますが、社内のプロキシやファイアウォールがダウンロードを止めている場合もあります。サポート対象国にいるのに403が続くなら、プロキシ設定の確認へ進みます。 - 3
5xx が返る
一時的なサービス障害の可能性が高く、数分待って再試行します。
- 4
応答なし・名前解決失敗・タイムアウト
ネットワークが接続を止めています。社内ファイアウォールやプロキシ、地域的な制限、古いCA証明書によるTLS失敗などが典型です。プロキシ設定へ進みます。
プロキシ配下では環境変数を先に設定する
社内ネットワークで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企業プロキシがTLSインスペクションをしている場合は、社内CAの証明書を--cacertで渡す方法もあります(curl --cacert /path/to/corporate-ca.pem -fsSL https://claude.ai/install.sh | bash)。社内CA証明書やmTLSまで必要な環境の手順は、Claude Codeプロキシ設定にあります。
Windowsでは事情が違います。PowerShellのインストーラーは.NET経由でダウンロードし、TLSの検証にWindowsの証明書ストアを使うので、--cacertは効きません。プロキシのCA証明書がストアに無いときは、社内IT部門に追加を依頼してから、インストーラーを実行します。
名前解決は通るのにTLSで失敗するとき
接続確認の応答が「TLS connect error」や「SSL/TLS secure channel」系の文言になる場合は、CA証明書が原因の切り分けになります。公式は次の順で案内しています。
Ubuntu/Debianでは、CA証明書パッケージを更新します。macOSのシステムcurlはKeychainの信頼ストアを使うので、macOS自体を更新すればルート証明書も更新されます。
sudo apt-get update && sudo apt-get install ca-certificatesWindowsでは、PowerShellのインストーラーを実行する前に、そのセッションでTLS 1.2を有効にします。
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
irm https://claude.ai/install.ps1 | iexWindowsのcurlがCRYPT_E_NO_REVOCATION_CHECK (0x80092012)やCRYPT_E_REVOCATION_OFFLINE (0x80092013)を返すときは、サーバーには届いていて、証明書の失効確認だけがネットワークに塞がれています。企業のファイアウォールの内側でよくある状況です。コマンドプロンプトでinstall.cmdをcurlで取得しているなら、そのコマンドに--ssl-revoke-best-effortを付けて再実行します。PowerShellのインストーラーは失効確認サーバーに届かなくても失敗しないため、PowerShellから実行する手もあります。
Linuxのパッケージマネージャー(apt・dnf・apk)経由の導入も公式に載っていますが、リポジトリやGPG鍵の取得先が同じdownloads.claude.aiです。ホストの遮断が原因のときは、こちらも同じ壁に当たります。
代替インストーラーが効くのはどの場合か
Homebrew(macOS)とWinGet(Windows)は、curl | bashとは別のインストール経路です。
brew install --cask claude-codewinget install Anthropic.ClaudeCode注意したいのは、これで直る条件です。公式は403の項で、代替インストーラーは同じホストに接続するため、サポート対象国にいて403が続くなら、先にネットワーク接続の確認を済ませるよう案内しています。ホストそのものが遮断されている環境では、経路を替えても同じ壁に当たる可能性があります。一方でWinGetは、公式が「curlを使わずに済む」と説明している方法です。パイプやBash側が原因の失敗、たとえばWindowsでcurlが絡む失敗を避けたいときに向きます。
Homebrewのclaude-codeはstableリリースチャンネルを追うため、通常は約1週間遅れます。最新チャンネルを使うcaskはclaude-code@latestです。
インストール後はclaude --versionで確認します。手元(v2.1.285)では次のとおりでした。
claude --version2.1.285 (Claude Code)HomebrewとWinGetの導入は、既定では自動更新されません。環境変数CLAUDE_CODE_PACKAGE_MANAGER_AUTO_UPDATEを1にすると、新しいバージョンが出たときにClaude Codeがバックグラウンドで更新を実行し、成功すると再起動を促します。WinGetでは実行中の実行ファイルをWindowsがロックするため更新に失敗することがあり、その場合は手動のコマンドが表示されます。手動で更新するときはbrew upgrade claude-code(最新チャンネルのcaskならbrew upgrade claude-code@latest)とwinget upgrade Anthropic.ClaudeCodeで手動で行います。claude --versionは通るのに別の不調があるときは、claude doctorで診断レポートを出せます。
「見つからない」と出るときは、インストールを試したターミナルに古いPATHが残っているため、新しいターミナルで再確認します。Homebrewの導入経路の比較はClaude Code Homebrew・npm・ネイティブ導入の比較、Windowsの選択肢はClaude Code Windowsインストールにあります。
CIやDockerで自動化しているとき
ログだけを見て機械的にリトライを組むと、瞬断と恒常的な遮断を区別できません。インストールの前に接続確認を走らせ、ステータスで分岐させます。
status=$(curl -s -o /dev/null -w '%{http_code}' \
https://downloads.claude.ai/claude-code-releases/latest)
if [ "$status" = "200" ]; then
curl -fsSL https://claude.ai/install.sh | bash
else
echo "downloads.claude.ai: HTTP $status" >&2
exit 1
fi200以外ならインストールに進まず、ステータスをログに残して止めます。5xxは一時的なサービス障害のことが多いので、その場合だけ数分空けて再試行するジョブにすると、403や名前解決失敗の環境で待ち続けることがありません。
DockerfileでもClaude Codeのインストールは同じcurl | bashです。ビルド環境が遮断されていれば、同じcurl: (56)や(23)に当たります。ビルドが止まる場合は、ネットワークとは別に、公式が挙げるDocker固有の原因も見ます。rootで/からインストールすると、インストーラーがファイルシステム全体を走査してメモリを使いすぎ、ハングすることがあります。
WORKDIR /tmp
RUN curl -fsSL https://claude.ai/install.sh | bashWORKDIRで走査範囲を小さくします。Docker Desktopでは、ビルド用コンテナが仮想マシンのメモリを共有するため、Settings > Resourcesでメモリ上限を上げる手もあります。
まとめ
エラー番号は原因を決めません。経路を替える前に、同じホストへ届くかを確かめます。インストール全般のエラーはClaude Codeインストールエラーの切り分けチェックリストにあります。