curlコマンドでHTTP通信|GET/POSTと死活監視・wgetとの使い分け


この記事の監修:宮崎智広(Linux教育歴15年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips > curlコマンドでHTTP通信|GET/POSTと死活監視・wgetとの使い分け
「APIの動作確認をしたいけど、curlの書き方がわからない」
「curlでPOSTを送りたいのに、サーバーから400エラーが返ってくる」
Linuxサーバーの運用では、Webサービスの死活監視、APIの動作テスト、SSL証明書の確認など、HTTPリクエストをコマンドラインから送る場面が数多くあります。

この記事では、Linuxの curl コマンドについて、基本的なGETリクエストから、POSTでのデータ送信、レスポンスヘッダーの確認、SSL証明書の検証、認証付きアクセス、トラブルシュートまでを解説します。
wget との使い分けについても触れていますので、現場で迷わず使い分けられるようになるはずです。

関連記事:PUT/DELETEを含むREST API全般や curl の詳しい使い方は、姉妹記事『curlコマンドの使い方|REST API(GET/POST/PUT/DELETE)とファイルダウンロード実践』で詳しく解説しています。
動作確認環境:RHEL 9.4 / Ubuntu 24.04 LTS / curl 8.5
【この記事でわかること】
curl -I でHTTPステータスとレスポンスヘッダーを即座に確認する方法
-d-H でJSON APIへのPOSTリクエストを送る方法
-w '%{http_code}' で死活監視スクリプトに組み込む方法
・エラー番号(6/7/28/60)ごとの原因と対処法
curlwget の使い分け基準

「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

curlとは?HTTP通信を行うコマンド

curl(カール)は、HTTP・HTTPS・FTP・SFTPなど、さまざまなプロトコルに対応したデータ転送コマンドです。
URLを指定してリクエストを送り、レスポンスを標準出力やファイルに取得できます。

wget がファイルのダウンロードに特化しているのに対し、curl はHTTPメソッド(GET・POST・PUT・DELETE)を自由に指定でき、ヘッダーの操作やJSON送信も得意です。
API連携やWebサービスの動作確認には curl が適しています。

# 基本書式 # curl [オプション] URL

curl がインストールされていない場合は、以下のコマンドでインストールしてください。

# RHEL/CentOS/AlmaLinux # yum install curl # Ubuntu/Debian # apt install curl

基本的な使い方(GETリクエスト)

1. URLを指定してページを取得する

最もシンプルな使い方は、URLをそのまま引数に渡す方法です。
サーバーからのレスポンスボディが標準出力に表示されます。

# Webページの内容を取得する $ curl https://www.example.com/

HTMLソースがターミナルに表示されます。
Webサーバーが正常に応答しているかの簡易確認として、これだけでも十分使えます。

2. レスポンスをファイルに保存する(-o / -O)

取得した内容をファイルに保存するには、-o(小文字)でファイル名を指定するか、-O(大文字)でURL末尾のファイル名をそのまま使います。

# ファイル名を指定して保存する $ curl -o output.html https://www.example.com/ # URL末尾のファイル名で保存する $ curl -O https://www.example.com/archive.tar.gz

-O はURLの最後のスラッシュ以降をファイル名として使います。
URLの末尾がスラッシュで終わっている場合はファイル名が空になるため、その場合は -o で明示的に指定してください。

3. レスポンスヘッダーを確認する(-I / -i)

サーバーからのHTTPステータスコードやContent-Typeを確認したい場合は、-I(HEADリクエスト)または -i(レスポンスヘッダー付き表示)を使います。

# HEADリクエストでヘッダーだけ取得する $ curl -I https://www.example.com/ # GETリクエストでヘッダー+ボディを取得する $ curl -i https://www.example.com/

-I の出力例は以下のようになります。

HTTP/1.1 200 OK Date: Thu, 03 Apr 2026 05:30:12 GMT Server: Apache/2.4.62 (Red Hat Enterprise Linux) X-Powered-By: PHP/8.2.25 Content-Type: text/html; charset=UTF-8 Content-Length: 48362 Connection: keep-alive

ステータスコード200が返ればサーバーは正常に動作しています。
障害対応の初動で「とりあえず curl -I で確認」というのは、現場のエンジニアが日常的に行う操作です。

4. HTTPステータスコードだけを取得する(-w / -s)

シェルスクリプトでの死活監視に使う場合は、ステータスコードだけを取得できると便利です。

# ステータスコードだけを取得する $ curl -s -o /dev/null -w '%{http_code}' https://www.example.com/ 200

-s:プログレスバーやエラーメッセージを非表示にする(silent)
-o /dev/null:レスポンスボディを捨てる
-w '%{http_code}':HTTPステータスコードだけを出力する

この書き方はcronで定期的にWebサーバーの応答を確認するスクリプトでよく使われます。

POSTリクエストでデータを送信する

5. フォームデータを送信する(-d)

-d(data)オプションを使うと、POSTリクエストでデータを送信できます。
Content-Typeは自動的に application/x-www-form-urlencoded に設定されます。

# フォームデータをPOSTで送信する $ curl -d 'username=admin&password=secret' https://www.example.com/login

6. JSONデータを送信する(-H / -d)

REST APIにJSONを送る場合は、-H(Header)でContent-Typeを指定し、-d でJSONデータを渡します。

# JSONデータをPOSTで送信する $ curl -X POST -H 'Content-Type: application/json' -d '{"name":"test","value":123}' https://api.example.com/data

-X POST:HTTPメソッドを明示的にPOSTに指定する
-H 'Content-Type: application/json':リクエストヘッダーを追加する

-d を使うと自動的にPOSTメソッドになるため、-X POST は省略しても動作します。
ただし、可読性のために明示しておくことを推奨します。

7. ファイルの内容をPOSTで送信する(@ファイル名)

JSONデータが長い場合は、ファイルに書いておいて @ で指定するのが便利です。

# ファイルの内容をPOSTで送信する $ curl -X POST -H 'Content-Type: application/json' -d @request.json https://api.example.com/data

実務で役立つcurlの応用テクニック

8. リダイレクトを自動的にたどる(-L)

Webサーバーが301や302でリダイレクトを返す場合、デフォルトでは curl はリダイレクト先に移動しません。
-L(Location)オプションを付けると、自動的にリダイレクト先をたどります。

# リダイレクトを自動的にたどる $ curl -L https://www.example.com/old-page

HTTPSへのリダイレクト(301)が設定されているサイトでは、-L を付けないと空のレスポンスが返ることがあります。

9. タイムアウトを設定する(--connect-timeout / -m)

ネットワーク障害の調査やスクリプトでの利用時には、タイムアウトを設定しておかないと処理が止まったまま待ち続けることになります。

# 接続タイムアウトを5秒、全体のタイムアウトを10秒に設定する $ curl --connect-timeout 5 -m 10 https://www.example.com/

--connect-timeout 5:TCP接続の確立を5秒でタイムアウトにする
-m 10:リクエスト全体(接続+データ転送)を10秒でタイムアウトにする

監視スクリプトでは必ずタイムアウトを設定してください。
設定しないと、サーバーが応答しない場合にスクリプト全体が止まります。

10. Basic認証付きでアクセスする(-u)

Basic認証が設定されたページにアクセスするには、-u(user)オプションでユーザー名とパスワードを指定します。

# Basic認証付きでアクセスする $ curl -u admin:password https://www.example.com/admin/

パスワードをコマンドラインに直接書くと history に残るため、実運用では -u admin のようにパスワードを省略して対話入力するか、-n オプションで ~/.netrc ファイルを参照する方法が安全です。

11. SSL証明書を検証しない(-k)

開発環境やオレオレ証明書(自己署名証明書)を使っている環境では、SSL証明書の検証エラーが出ることがあります。

# SSL証明書の検証をスキップする $ curl -k https://dev.example.com/

注意:-k は本番環境では使わないでください。
中間者攻撃(MITM)を検出できなくなります。あくまで開発環境やテスト用途に限定してください。

12. SSL証明書の有効期限を確認する(-v)

SSL証明書の期限切れは障害の原因になります。
curl -v(verbose)でサーバーに接続すると、証明書の情報が表示されます。

# SSL証明書の情報を確認する $ curl -v https://www.example.com/ 2>&1 | grep -E 'expire|subject|issuer'

証明書の有効期限(expire date)や発行者(issuer)が確認できます。
証明書更新後の動作確認にも使えるテクニックです。

curlとwgetの使い分け|機能比較と現場での選び方

「curlとwgetはどちらを使えばいいのか?」という質問は、現場でも新人からベテランまでよく出てきます。
結論から言うと、APIと対話するならcurl、ファイルをまとめて取得するならwgetです。とはいえ、用途はかなり重なっていて、両方とも主要ディストリビューションに標準で入っています。

ここでは両者の機能を比較表で整理した上で、よくあるシナリオ別に使い分けの判断基準をまとめておきます。

なぜcurlとwgetの2つが存在するのか

wget は1996年に登場した「ファイルを確実にダウンロードする」ことを目的に作られたツールです。-r(再帰)や -c(レジューム)のように、回線が不安定な時代に大容量ファイルを取りきるためのオプションが揃っています。
一方の curl は1997年に登場し、「任意のプロトコルで任意のリクエストを送る」ことを目的に設計されました。HTTPメソッドの自由な指定やヘッダー操作、認証方式の豊富さは、API時代の現在にそのまま活きています。

歴史的な経緯は違いますが、現代のLinuxサーバー運用では両方とも入っていて当たり前のツールなので、目的に応じて切り替えて使うのが正解です。

curlとwgetの機能比較表

両者の機能対応を、現場でよく使う項目で比較すると以下のようになります。

機能 curl wget
HTTPメソッド指定(GET/POST/PUT/DELETE) 自由に指定可(-X GETのみ(POSTは --post-data で限定的)
リダイレクト追従 -L で明示的に追従 デフォルトで追従
認証(Basic/Digest/Bearer) -u / -H で幅広く対応 --user / --password(基本認証中心)
再帰ダウンロード(サイトミラーリング) 対応しない -r / -m で再帰取得可能
レジューム(中断再開) -C - で対応 -c で対応(より安定)
POSTデータ送信(JSON含む) -d / -H で完全対応 --post-data のみ
任意ヘッダーの付与 -H で何個でも追加可 --header で追加可
ファイル名の自動保存 -O でURL末尾を使用 デフォルトで自動保存
URLリストから一括ダウンロード -K configfile で対応 -i urls.txt で簡潔
バックグラウンド実行 シェルの & に頼る -b で組み込み対応
HTTPステータスコードの取得 -w '%{http_code}' で簡単 直接取得する手段なし
レスポンスヘッダーのみ取得 -I でHEADリクエスト --spider -S で代替可
WebSocket / HTTP/3 対応(ビルドによる) 対応しない
スクリプトへの組み込みやすさ ◎(終了コード・書式が豊富) ○(ログ出力が扱いやすい)
「APIと会話する」方向に特化しているのが curl、「ファイルを確実に落とす」方向に特化しているのが wget と整理すると理解しやすいです。

用途別の使い分けガイド

よくあるシナリオ別に、どちらを使うべきかを一覧にまとめました。迷ったらこの表を見てください。

やりたいこと 推奨 コマンド例
REST APIの動作確認(JSON送受信) curl curl -X POST -H 'Content-Type: application/json' -d @req.json URL
サイト全体をミラーリング wget wget -m -k -np https://www.example.com/
大容量ファイルのレジューム付きダウンロード wget wget -c https://example.com/big.iso
Webサーバーの死活監視・ヘルスチェック curl curl -s -o /dev/null -w '%{http_code}' URL
複数URLを一括ダウンロード wget wget -i urls.txt
Bearerトークン認証が必要なAPIアクセス curl curl -H 'Authorization: Bearer TOKEN' URL
SSL証明書の有効期限確認 curl curl -vI https://example.com 2>&1 | grep 'expire'
バックグラウンドで長時間ダウンロード wget wget -b -o dl.log https://example.com/big.tar.gz
プロキシ越しのファイル取得 どちらでも可 curl -x http://proxy:8080 URL / wget -e use_proxy=yes URL
レスポンスタイム計測(DNS・接続・転送別) curl curl -o /dev/null -s -w 'DNS:%{time_namelookup} Total:%{time_total}' URL

同じ目的をcurlとwgetで書き比べる

同じタスクを両方で書くとどう違うのか、代表的な3パターンで比べてみましょう。

(1)ファイルをダウンロードして名前を変える

# curlで取得(-o で出力ファイル名を指定) $ curl -o latest.tar.gz https://example.com/releases/v1.0.tar.gz # wgetで取得(-O で出力ファイル名を指定) $ wget -O latest.tar.gz https://example.com/releases/v1.0.tar.gz

オプション名が -o / -O で逆の意味になっているので注意してください。curlは小文字 -o が「ファイル名指定」、wgetは大文字 -O が「ファイル名指定」です。

(2)HTTPステータスコードだけを取得する

# curlの場合(1行で完結) $ curl -s -o /dev/null -w '%{http_code} ' https://www.example.com/ 200 # wgetの場合(--spider と -S の組み合わせ、grepで抽出) $ wget --spider -S https://www.example.com/ 2>&1 | awk '/HTTP\//{print $2}' 200

死活監視スクリプトに組み込むなら、curlの書き方の方が圧倒的にシンプルで終了コードも扱いやすいです。

死活監視はcurl+wgetの併用パターンが定番

現場では「curlで疎通を確認し、問題なければwgetで設定ファイルを取得する」という併用パターンもよく見られます。cronのヘルスチェックスクリプトでは、以下のような書き方が定番です。

#!/bin/bash # ヘルスチェック+設定ファイル取得の併用例 URL="https://www.example.com/health" CODE=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 -m 10 "$URL") if [ "$CODE" = "200" ]; then wget -q -N -P /etc/myapp/ https://www.example.com/config/latest.conf else echo "health check failed: $CODE" | logger -t myapp fi

「リクエストの精密な制御はcurl、ファイルの確実な取得はwget」と役割を分担させると、スクリプトの意図がはっきりします。片方だけで全部やろうとするより、両方の強みを理解して使い分けた方が、現場のスクリプトはシンプルで保守しやすくなります。

トラブルシュート・エラー対処

「curl: (6) Could not resolve host」が出た時の対処法

DNS解決に失敗しています。以下を順番に確認してください。

・URLのホスト名にタイプミスがないか確認する
nslookupdig でDNS解決ができるか確認する
/etc/resolv.conf にDNSサーバーが正しく設定されているか確認する

# DNSの名前解決を確認する $ nslookup www.example.com $ cat /etc/resolv.conf

「curl: (7) Failed to connect」が出た時の対処法

TCP接続に失敗しています。
サーバーが起動していない、ファイアウォールでブロックされている、ポートが間違っているなどの原因が考えられます。

# ポートが開いているか確認する $ ss -tlnp | grep :80 $ ss -tlnp | grep :443

「curl: (60) SSL certificate problem」が出た時の対処法

SSL証明書の検証に失敗しています。原因として多いのは以下の3つです。

・証明書の有効期限が切れている
・自己署名証明書を使っている
・CA証明書バンドルが古い

# CA証明書バンドルを更新する(RHEL/CentOS/AlmaLinux) # yum update ca-certificates # Ubuntu/Debian # apt update && apt install --reinstall ca-certificates

開発環境でどうしても自己署名証明書を使う必要がある場合は curl -k で一時的に検証をスキップできますが、本番環境では正規の証明書を使ってください。

「curl: (28) Operation timed out」が出た時の対処法

接続先のサーバーが応答しない、またはネットワーク経路に問題があります。

# ネットワーク経路を確認する $ traceroute www.example.com # サーバーへの疎通を確認する $ ping -c 3 www.example.com

プロキシ環境で curl が通らない場合は、環境変数 http_proxy / https_proxy が正しく設定されているか確認してください。

# プロキシ環境変数を設定する $ export http_proxy=http://proxy.example.com:8080 $ export https_proxy=http://proxy.example.com:8080

本記事のまとめ

curl コマンドの使い方を、基本のGETリクエストからPOST送信、SSL証明書の確認、トラブルシュートまで解説しました。

やりたいこと コマンド
Webページを取得する curl https://www.example.com/
ファイルに保存する curl -o output.html https://www.example.com/
レスポンスヘッダーを確認する curl -I https://www.example.com/
ステータスコードだけ取得する curl -s -o /dev/null -w '%{http_code}' URL
POSTでフォームデータを送信する curl -d 'key=value' URL
POSTでJSONを送信する curl -X POST -H 'Content-Type: application/json' -d '{"key":"value"}' URL
リダイレクトをたどる curl -L URL
タイムアウトを設定する curl --connect-timeout 5 -m 10 URL
Basic認証付きでアクセスする curl -u user:pass URL
SSL検証をスキップする curl -k URL

関連記事

curlと関連性の高い記事をまとめました。あわせて読むことで理解が深まります。

ssコマンドでソケット情報を確認する方法|LISTEN・ESTABの見方やポート確認も
LinuxのDNS設定方法|resolv.confが元に戻る原因とnmcliの手順
wgetコマンドでファイルをダウンロードする方法|再開やプロキシ設定も

「curlを使いこなして、サーバー監視・API連携を自動化したい」と思いませんか?

HTTP通信の仕組みとcurlの使い方を体系的に理解すると、障害対応の初動が格段に速くなります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。


無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。