curlコマンドの使い方|通信の確認に使うオプション

curlコマンドの使い方

curlコマンドは、URLを指定してWebサーバーなどと通信し、返ってきた中身を表示するコマンドです。-Iで応答のヘッダーだけ、-vで通信の途中経過、-wで所要時間を出せます。Windows 10・11にも最初から入っています。

この記事でわかること

  • curlコマンドの基本の書き方と、よく使うオプションの一覧
  • -vの出力で、どこまで通信が進んだかを読む方法
  • -wでDNS・接続・TLS・サーバー処理の時間を分けて測る方法
  • –resolveでDNSを変えずに特定のサーバーを試す方法
  • 終了コード(6・7・28・35・60)別の原因の見当のつけ方

一次情報: curl「curl man page」(参照)/curl「curl shipped by Microsoft」(参照)/Microsoft Learn「curl on Windows」(参照)/RFC 9110「HTTP Semantics」(参照)※2026年10月時点

curlでWebやAPIの応答を確かめるのは、ネットワークとサーバーの境目にある仕事です。2つの職種で業務と年収がどう違うかは、別の記事で整理しています。

目次

curlコマンドとは?URLを指定して通信するコマンド

curlコマンドとは、URLを指定して相手と通信し、返ってきた中身をそのまま画面に出すコマンドです。HTTPやHTTPSのほか、FTPなど多くの通信方式に対応しています。

ブラウザと違い、画面を描かずに「何が返ってきたか」を文字で見せるのが特徴です。そのため、Webサーバーやロードバランサーの応答確認、APIの動作確認、障害時の切り分けでよく使われます。

Windowsにも最初から入っている

curlの公式サイトによると、Windows 10と11には、どのインストールにもcurlが標準で入っています。コマンドプロンプトで「curl –version」と打つと出る1行目が、入っているcurlの版です。

ただし、Windows PowerShell 5.1だけは注意してください。Microsoftの資料のとおり、5.1には「curl」という別名が定義されていて、中身はInvoke-WebRequestという別のコマンドです。PowerShellでは「curl.exe」と拡張子まで打つと、本物のcurlが動きます。PowerShell 7以降には、この別名はありません。

curlコマンドを打つ場所と注意点
打つ場所そのまま「curl」で動くか注意点
Linux・Mac動く入っていない最小構成のLinuxもある
Windowsのコマンドプロンプト動く出力先を捨てるときは「NUL」を使う
Windows PowerShell 5.1別のコマンドが動く「curl.exe」と打つ
PowerShell 7以降動く別名の問題はない

curlコマンドの基本の書き方とよく使うオプション

基本は「curl オプション URL」です。オプションを付けなければ、相手が返した本文(HTMLなど)がそのまま画面に流れます。

curl https://www.example.com/
curl -I https://www.example.com/
curl -o page.html https://www.example.com/
curlコマンドのよく使うオプション
オプション意味使う場面
-I応答のヘッダーだけを取るステータスコードの確認
-iヘッダーと本文の両方を出す中身もあわせて見たいとき
-v通信の途中経過を出すどこで止まるかを見るとき
-o ファイル/-O結果をファイルに保存ダウンロード
-L転送先(301・302)を追いかけるリダイレクトのあるURL
-s進み具合の表示を消すスクリプトや-wと組み合わせるとき
-m 秒/–connect-timeout 秒全体/接続までの待ち時間の上限応答が無いときに早く切る
-x プロキシ指定したプロキシを通す社内からインターネットへ出るとき
-k証明書の検証を飛ばす検証環境だけ。本番では使わない
-X・-H・-d方式・ヘッダー・送るデータを指定APIの確認

-Iでは、1行目にステータスコードが出ます。200なら正常、301や302は別のURLへの転送、403は拒否、503はサーバー側が受け付けられない状態です。これらの意味はRFC 9110で決められています。

-vの出力で、どこまで進んだかを読む

-vを付けると、行の先頭の記号で3種類の情報が分かれて出ます。この記号を覚えておくと、長い出力でも迷いません。

* Trying 192.0.2.10:443...
* Connected to www.example.com (192.0.2.10) port 443
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
> GET / HTTP/1.1
> Host: www.example.com
< HTTP/1.1 200 OK
< Content-Type: text/html
-vの行頭の記号と意味
行頭中身読み方
*curl自身の進み具合Trying→Connected→TLSの順に進めば通信は確立している
>こちらが送ったリクエスト送ったURL・Hostヘッダーが正しいか
<相手が返した応答1行目がステータスコード

「Trying」のまま止まれば、相手のポートまで届いていません。「Connected」の後のTLSの行で止まれば、証明書や暗号の交渉の段階です。「<」の行が出ていれば、ネットワークはつながっていて、問題はサーバーの応答の中身にあります。

WindowsのcurlはTLSの処理に「Schannel」を使うため、TLSの行の表示がLinuxと少し違います。読み方の順番は同じです。

-wで時間を分けて測る|どこが遅いかを数字で見る

「Webが遅い」と言われたとき、遅いのがDNSなのか、回線なのか、サーバーの処理なのかを分けるのに-wが役立ちます。-wは、通信が終わった後に指定した項目を表示するオプションです。

curl -o /dev/null -s -w "dns:%{time_namelookup} tcp:%{time_connect} tls:%{time_appconnect} first:%{time_starttransfer} total:%{time_total}\n" https://www.example.com/

Windowsのコマンドプロンプトでは「/dev/null」を「NUL」に替えます。表示される数字は、どれも「始めてから、その段階が終わるまで」の秒数です。

-wで出す時間の項目(いずれも開始からの累計・秒)
項目終わった段階ここだけ大きいときに疑う場所
time_namelookup名前解決DNSサーバー、DNSの設定
time_connectTCPの接続回線の遅延、途中のファイアウォール
time_appconnectTLSの交渉証明書の確認、暗号の処理
time_starttransfer最初の1バイトの受信サーバーやアプリの処理
time_total全体本文が大きい、帯域が足りない

curlの資料にあるとおり、各項目は累計の値です。各段階にかかった時間は、1つ前の項目との差で読みます。

差を取ると、遅い段階が1つに絞れる

  • -wの数字は開始からの累計。前の項目との差を見る
  • 1time_namelookup名前解決にかかった秒数そのもの。大きければDNSを疑う
  • 2time_connect − time_namelookupTCPの接続に使った分。往復の遅延がほぼそのまま出る
  • 3time_appconnect − time_connectTLSの交渉にかかった時間。HTTPでは0のまま
  • 4time_starttransfer − time_appconnectサーバーが最初の1バイトを返すまで。アプリの処理時間に近い

4だけが大きければネットワークではなくサーバー側。数字を添えて担当へ渡すと話が早い。

図:-wの累計値を引き算して、DNS・接続・TLS・サーバー処理のどこが遅いかを読む

DNSを変えずに特定のサーバーを試す(–resolve)

ロードバランサーの後ろに複数台のサーバーがあると、どのサーバーが応答したのか分からないことがあります。新しいサーバーをDNSに登録する前に、先に動作を確かめたい場面もあるでしょう。こうしたときに使うのが–resolveです。

curl -I --resolve www.example.com:443:192.0.2.21 https://www.example.com/

この書き方では、URLのホスト名はそのままに、接続先だけを192.0.2.21に差し替えます。curlの資料では「コマンドラインで書くhostsファイルの代わり」と説明されています。

hostsファイルを書き換えずに済むので、PC全体の通信に影響を出しません。URLの名前はそのままなので、HTTPSの証明書の確認もふだんどおり行われるのが利点です。

curlのエラーは終了コードで読む

curlは、失敗すると番号つきの終了コードを返します。番号がそのまま「どの段階で失敗したか」を表すので、メッセージを読み飛ばしても原因の見当がつきます。

ネットワークの切り分けでよく見る終了コード
番号curlの資料での意味疑う場所
6Could not resolve host(名前が引けない)DNS、ホスト名の綴り
7Failed to connect to host(接続できない)ポートが閉じている、ファイアウォール
28Operation timeout(時間切れ)途中で通信が捨てられている、相手が遅い
35SSL connect error(TLSの交渉に失敗)暗号方式の不一致、途中の機器の介入
60証明書を信頼できるCAで確かめられない証明書の期限・発行元、社内の中継装置

終了コードを表示するコマンドは、Linuxなら「echo $?」、コマンドプロンプトなら「echo %ERRORLEVEL%」、PowerShellなら「$LASTEXITCODE」です。監視のスクリプトに組み込むときも、この番号で分岐させると扱いやすくなります。

社内のプロキシを通すとき

会社のネットワークでは、外へ出る通信がプロキシ経由に決められていることがよくあります。プロキシを指定しないと、7や28で失敗するのが典型です。

curl -x proxy.example.local:8080 -I https://www.example.com/

逆に、社内のサーバーへの確認なのにプロキシを通ってしまい失敗する例もあります。環境変数にプロキシが入っていないかも、あわせて確かめておくと迷いません。

よくある質問

PowerShellでcurlを打つと、オプションのエラーになります

Windows PowerShell 5.1では「curl」がInvoke-WebRequestの別名になっているためです。「curl.exe」と拡張子まで打てば、本物のcurlが動きます。PowerShell 7以降なら、この問題は起きません。

-kを付けると証明書のエラーが消えますが、使っていいですか?

-kは、相手が本物かどうかの確認を飛ばすオプションです。検証用の機器で、自分で作った証明書を使っている場面に限るのが基本になります。本番のサイトで60のエラーが出るなら、証明書の期限や中間証明書の抜けを先に調べてください。

curlでポートが開いているかを確かめられますか?

確かめられます。「curl -v telnet://相手:ポート番号」と打ち、「Connected to」の行が出れば、そのポートにTCPでつながった証拠です。Windowsでtelnetを入れられないときの代わりとして使えます。

curlとwgetは何が違いますか?

wgetはファイルを取ってくることに向いた道具で、まとめてのダウンロードが得意です。curlは送り方を細かく決められるので、ヘッダーの確認やAPIの動作確認、通信の切り分けに向いています。Windowsに標準で入っているのはcurlのほうです。

APIにJSONを送るにはどう書きますか?

「curl -X POST -H “Content-Type: application/json” -d “{\”name\”:\”test\”}” URL」のように、方式・ヘッダー・本文を指定します。コマンドプロンプトでは、本文の中の「”」を「\”」のように書く必要があります。長くなるときは、本文をファイルにして「-d @data.json」で読ませると崩れません。

まとめ

  • curlコマンドは、URLを指定して通信し、返ってきた中身を文字で見せる
  • Windows 10・11にも標準で入る。PowerShell 5.1では「curl.exe」と打つ
  • -Iでステータス、-vで途中経過、-wで段階ごとの時間を見る
  • –resolveなら、DNSやhostsを変えずに特定のサーバーを試せる
  • 終了コード6はDNS、7は接続、28は時間切れ、35・60はTLSと証明書を疑う

curlで「どの段階が遅いか」を数字で示せると、サーバー担当やアプリ担当とのやり取りが一気に短くなります。名前解決が怪しいときはdigやnslookup、届かないときはpingやtracertへと、段階に合わせてコマンドを替えていくのが近道です。

障害の原因を数字で示して切り分けられる力は、年収の交渉でも評価につながります。経験年数や資格ごとに、ネットワークエンジニアの年収相場を整理した記事です。

ネットワークエンジニアの年収相場を見る


免責事項

※本記事はcurlの公式資料・Microsoftの公式ドキュメント・RFCなどの公開情報をもとに整理したものです。コマンドの表示や挙動は、OSやcurlのバージョン・環境によって変わる場合があります。業務で使う環境では、所属先の手順と各製品の最新資料をあわせてご確認ください。


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Tanabeです。新卒でSIerに入り、ネットワークの設計から構築、運用保守、クラウド移行まで10年やってきました。その間に転職を3回、CCNPも取りました。

正直に言うと、資格を取っても年収はすぐには上がりませんでした。1回目の転職は失敗、2回目でようやく150万円上がり、3回目で今の事業会社に落ち着いた。動いてみて分かったのは、資格の有無より「現場で何を任されてきたか」で評価が決まる、ということです。

エージェントの言葉を鵜呑みにして、危うく後悔しかけた経験もあります。だからこそ、自分がやらかした失敗をそのまま書いて、同じ回り道をしなくて済むように残しています。転職を考え始めた人が、条件で損をしないための材料にしてもらえたら嬉しいです。

目次