「curlでPOSTを送りたいのに、サーバーから400エラーが返ってくる」
Linuxサーバーの運用では、Webサービスの死活監視、APIの動作テスト、SSL証明書の確認など、HTTPリクエストをコマンドラインから送る場面が数多くあります。
この記事では、Linuxの
curl コマンドについて、基本的なGETリクエストから、POSTでのデータ送信、レスポンスヘッダーの確認、SSL証明書の検証、認証付きアクセス、トラブルシュートまでを解説します。wget との使い分けについても触れていますので、現場で迷わず使い分けられるようになるはずです。・
curl -I でHTTPステータスとレスポンスヘッダーを即座に確認する方法・
-d と -H でJSON APIへのPOSTリクエストを送る方法・
-w '%{http_code}' で死活監視スクリプトに組み込む方法・エラー番号(6/7/28/60)ごとの原因と対処法
・
curl と wget の使い分け基準でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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/
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
障害対応の初動で「とりあえず
curl -I で確認」というのは、現場のエンジニアが日常的に行う操作です。4. HTTPステータスコードだけを取得する(-w / -s)
シェルスクリプトでの死活監視に使う場合は、ステータスコードだけを取得できると便利です。# ステータスコードだけを取得する $ curl -s -o /dev/null -w '%{http_code}' https://www.example.com/ 200
・-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
・-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
-L を付けないと空のレスポンスが返ることがあります。9. タイムアウトを設定する(--connect-timeout / -m)
ネットワーク障害の調査やスクリプトでの利用時には、タイムアウトを設定しておかないと処理が止まったまま待ち続けることになります。# 接続タイムアウトを5秒、全体のタイムアウトを10秒に設定する $ curl --connect-timeout 5 -m 10 https://www.example.com/
・-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'
証明書更新後の動作確認にも使えるテクニックです。
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 | 対応(ビルドによる) | 対応しない |
| スクリプトへの組み込みやすさ | ◎(終了コード・書式が豊富) | ○(ログ出力が扱いやすい) |
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+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: (6) Could not resolve host」が出た時の対処法
DNS解決に失敗しています。以下を順番に確認してください。・URLのホスト名にタイプミスがないか確認する
・
nslookup や dig で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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます