Claude Codeのinstall scriptがHTML/403を返す原因と対処
install.shやinstall.ps1がHTMLページや裸の403を返すのは、地域制限・プロキシ遮断・一時障害のいずれかが原因です。切り分け手順を示します。
install scriptがHTML/403を返すとはどういう状態か
curl -fsSL https://claude.ai/install.sh | bashやirm https://claude.ai/install.ps1 | iexを実行したとき、返ってくるべきはインストールスクリプトそのものです。ところが実際にはHTMLページやエラーステータスが返り、シェルがそれを実行しようとして落ちます。bashなら次の形で現れます。
bash: line 1: syntax error near unexpected token `<'
bash: line 1: `<!DOCTYPE html>'<で始まるのはHTMLの先頭タグで、bashがそれをコマンドとして解釈しようとした結果です。PowerShellではiexがHTML・CSSをそのままパースしようとして、次のような形で崩れます。
iex : At line:1 char:2310
+ ... igin="anonymous"/><script type="text/javascript">!function(o,c){var n ...
Missing argument in parameter list.文言はPowerShellのバージョンやシステム言語で変わり、Missing expression after unary operator '--'やParserError・ParseExceptionになることもあります。共通しているのは、引用された文字列の中にHTMLタグやCSSが混じっている点です。ここで-OutFile install.ps1のようにファイルへ保存してから実行しようとしても解決しません。保存されるのは同じWebページなので、.ps1という拡張子が付くだけで中身はHTMLのままです。
ルーティングの経路によっては、本文なしの裸の403だけが返ることもあります。
curl: (22) The requested URL returned error: 403HTMLと裸の403は、ステータスコードの違いで分かれる
HTMLが表示されるケースと裸の403は、別の問題に見えます。分かれ目はレスポンスのステータスコードです。curl -fsSLの-fは、HTTPステータスが400以上のとき本文を捨てて終了コード22で止まるオプションです。
localhostに403のHTMLを返すだけの簡易サーバーに、-fsSLで同じパイプを向けると次のとおりです(curl 8.7.1、bash 3.2.57)。
curl -fsSL http://127.0.0.1:18403/install.sh | bashcurl: (22) The requested URL returned error: 403bashには何も渡らないので、構文エラーは出ません。ステータスが200のページを返すサーバーに向けると、同じコマンドが次のように落ちました。
bash: line 1: syntax error near unexpected token `<'
bash: line 1: `<!DOCTYPE html><html><body>App unavailable in region</body></html>'-fsSLのまま構文エラーが出たなら、HTMLを返した応答のステータスは400未満です。裸の403は、400以上のステータスで返っています。エラー文のトークンは本文の形でも変わり、HTMLが<html>だけで改行する形なら、unexpected tokenの後ろがnewlineに変わります。
理由の書かれたHTMLを読むには、-fを外します。
403のとき、-fの有無で見えるもの
-fsSL
curl: (22)の1行と終了コード22だけが残ります。地域制限なのかプロキシ遮断なのか、この1行からは区別できません。
-sSL
403の本文がそのまま出ます。公式ドキュメントでは、HTMLにApp unavailable in regionとあれば地域制限と案内されています。この一文は上の簡易サーバーが返した本文と同じ文言で、実際の403でも読める場合があります。
原因は地域制限・プロキシ遮断・一時障害の3系統
HTMLページでも裸の403でも、install URLがスクリプトの代わりにHTMLページやエラーステータスを返したという事実は共通です。原因は3つに分かれます。
原因の3系統
地域制限
HTMLに
App unavailable in regionと書かれていれば、Claude Codeが自分の国で提供されていません。国単位の提供対象外なので、通常はネットワーク設定の変更では解決しません。サポート対象国の一覧はhttps://www.anthropic.com/supported-countriesにあります。プロキシ・ファイアウォール遮断
裸の403や、応答なし・
Could not resolve host・タイムアウトで現れます。企業のプロキシやファイアウォールがdownloads.claude.aiへのダウンロードを止めています。一時障害
5xxが返る場合のほか、到達性の診断では200なのに元のコマンドだけ失敗した場合も当てはまります。ネットワークや地域的なルーティング、サービス側の一時的な障害が疑われます。
裸の403は、地域制限でもプロキシ遮断でも出ます。メッセージ本文が付かないため、この1行だけでは両者を断定できません。サポート対象国にいるのに403が出る場合は、次の到達性診断を先に済ませます。Homebrew・WinGetの代替インストーラーも同じホストに接続するため、遮断が原因なら代替では解決しません。
ダウンロード自体は始まったのに途中で切れる場合は、系統が異なります。curl: (56) Failure writing output to destinationは、ダウンロード自体が中断されたことを示す終了コード56です。curl: (23)は、curlが受け取った内容をパイプに書き込めなかったことを意味し、bashが途中で終了したときに出ます。どちらもスクリプトがbashに完全には渡っていない症状で、本記事の「応答そのものがスクリプトになっていない」ケースとは別です。
まず到達性を診断する
原因を切り分ける前に、インストーラーのダウンロード元に到達できているかを直接確認します。-sIはヘッダーだけを取得するオプションで、本体のHTMLやスクリプトを丸ごとダウンロードしません。install scriptの実行結果から推測するより、この1行のほうが速く確実です。
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/latest返ってきた1行目の意味は次のとおりです。
| 応答 | 意味 |
|---|---|
HTTP/2 200(macOS/Linux)・HTTP/1.1 200 OK(Windows付属curl) | 意味サーバーに到達している。インストールコマンドを再試行する |
403 | 意味プロキシやネットワークフィルターがホストをブロックしているか、地域制限の対象。サポート対象国にいるならプロキシ側を疑う |
5xx | 意味一時的なサービス障害。数分待って再試行する |
応答なし・Could not resolve host・タイムアウト | 意味ネットワークが接続そのものをブロックしている。社内ファイアウォールやプロキシ、地域的なネットワーク制限を確認する。インストーラーがFailed to fetch version from downloads.claude.aiと出す場合も、このホストがネットワーク上でブロックされている状態です |
ステータスとContent-Typeを1行で並べる書き方もあります。上の簡易サーバーに向けた出力は次のとおりです。text/htmlが返るなら、スクリプトではなくHTMLページが来ています。
curl -s -o /dev/null -w '%{http_code} %{content_type}\n' http://127.0.0.1:18403/install.sh403 text/html実行前に中身を確かめるなら、パイプせずにいったん保存します。-f付きで403を受けると、保存先のファイルは作られません。200でHTMLが返った場合は、先頭が<で始まるファイルが残ります。この状態でbash install.shに進まず、head -c 200 install.shで先頭を見ます。
社内ファイアウォールで許可リストを組む場合、downloads.claude.aiはネイティブインストーラー本体・自動更新・バージョンチェックに加えて、プラグイン実行ファイルの取得にも使われる通信先です。npmやbunでインストールする場合は、ネイティブインストーラーと自動更新の用途ではこのホストが不要になります。代わりにregistry.npmjs.orgへの到達性が必要です。プラグイン実行ファイルの取得など、インストール方式に関係なくdownloads.claude.aiを使う用途は残ります。
プロキシ配下での注意点
install scriptを実行する段階では、まだClaude Code自体はインストールされていません。この時点でHTTP通信を行っているのはcurlやPowerShellのInvoke-RestMethodなので、Claude Code本体の設定ファイルは効きません。シェルの環境変数HTTPS_PROXY・HTTP_PROXYを設定してから、同じコマンドを再実行します。
export HTTPS_PROXY=http://proxy.example.com:8080
export HTTP_PROXY=http://proxy.example.com:8080
curl -fsSL https://claude.ai/install.sh | bashPowerShellでは、プロセス内の環境変数として設定します。
$env:HTTPS_PROXY = 'http://proxy.example.com:8080'
$env:HTTP_PROXY = 'http://proxy.example.com:8080'
irm https://claude.ai/install.ps1 | iexプロキシのURLが分からないときは、IT部門に聞くか、ブラウザーのプロキシ設定を見ます。
インストール後のClaude Code本体は、https_proxy → HTTPS_PROXY → http_proxy → HTTP_PROXYの順で最初に設定された値を使います。本体はSOCKSプロキシに対応していません。インストール後の通信で詰まったときの手がかりになります。
社内プロキシがTLS検査を行う場合は、証明書検証で別のエラーになります。典型はunable to get local issuer certificateとSELF_SIGNED_CERT_IN_CHAINです。インストール段階の回避策は、実行環境で分かれます。
| 環境 | install時の対処 |
|---|---|
| macOS/Linux | install時の対処curl --cacert /path/to/corporate-ca.pem -fsSL https://claude.ai/install.sh | bashで、プロキシのCA証明書を指定する |
| Windows PowerShell | install時の対処インストーラーは.NET経由でダウンロードし、Windowsの証明書ストアで検証する。プロキシのCA証明書をストアに追加してもらってから実行する |
Windowsのcurl系のエラーにCRYPT_E_NO_REVOCATION_CHECK (0x80092012)やCRYPT_E_REVOCATION_OFFLINE (0x80092013)が出る場合は、サーバーには届いているものの、ネットワークが証明書の失効確認を遮断しています。企業ファイアウォール配下でよくある症状で、コマンドプロンプトから、install.cmdを取得するcurlに--ssl-revoke-best-effortを付けて再実行します。PowerShellインストーラーでは不要です。
curl --ssl-revoke-best-effort -fsSL https://claude.ai/install.cmd -o install.cmd && install.cmd && del install.cmdインストール完了後は、Claude Code本体のためにNODE_EXTRA_CA_CERTSを同じ証明書バンドルに向けます。CA証明書の指定方法の全体はClaude Codeプロキシ設定ガイドにまとめています。
診断のあとの対処の順番
到達性診断の結果が出たら、次の順で手を打ちます。
HTML/403が出たときの対処の順番
- 1
200なら、そのまま再実行する
到達性診断で
200が返るなら、サーバーには届いています。同じインストールコマンドをもう一度流します。 - 2
403・応答なしなら、プロキシ変数を設定する
上のプロキシ変数を設定して再実行します。TLS検査があるなら、CA証明書の指定も加えます。
- 3
変わらなければ、許可リストを依頼する
ネットワーク管理者に
downloads.claude.aiの許可を依頼します。地域制限が原因なら、通常はプロキシ変数や許可リストでは応答が変わりません。 - 4
地域制限でなければ、代替インストーラーを試す
macOSならHomebrew、WindowsならWinGetに切り替えます。同じホストへ接続するので、遮断が原因の場合は効きません。ルーティングや一時障害が原因のときに候補になります。
brew install --cask claude-codewinget install Anthropic.ClaudeCodeHomebrewでCask 'claude-code' is unavailableと出たら、brew updateで索引を更新してから再実行します。claude-codeのcaskはstableチャネルを追い、最新リリースより通常1週間ほど遅れます。最新が必要ならbrew install --cask claude-code@latestを使います。
インストール後はclaude --versionでバージョン番号が表示されることを確認します。同じ端末のままclaudeが見つからないと出た場合は、新しいターミナルウィンドウを開いて再確認します。インストール時のセッションは古いPATHを保持したままのことがあるためです。
よくあるつまずき
- 一時的な403を恒久的な遮断だと決めつける: 到達性診断をせずにいきなりプロキシ設定を変更したり、ファイアウォール管理者に問い合わせたりすると、数分後に自然回復した一時障害を見逃します。まず
curl -sIで状態を確認し、403の直後に何度か再試行して応答が変わらないかを見てから動きます。 - VS Code拡張を入れたのに
claudeが使えない: 拡張機能は、自分のチャットパネル用にCLIの専用コピーを拡張機能ディレクトリの中に持っています。PATHには追加されないため、ターミナルから使うには単体インストールが別に必要です。
まとめ
HTMLでも裸の403でも、まずcurl -sI https://downloads.claude.ai/claude-code-releases/latestの1行目を見れば、再試行で済むのか、プロキシ設定の問題なのか、地域制限なのかの見当がつきます。ここに挙げていないcommand not foundや権限エラーなど別の症状は、Claude Codeインストールエラーの切り分けチェックリストに症状別の一覧があります。