「POSTでJSONデータを送信する方法を知りたい」
「OllamaなどのローカルLLMやChatGPT APIにもcurlで質問を送れると聞いたが、どうすればいいのか」
curlはURLを指定してデータを取得・送信できるコマンドです。Web APIの動作確認、ファイルのダウンロード、HTTPヘッダの確認など、サーバー管理や開発の現場で幅広く使います。最近ではOllamaなどのローカルLLMがREST APIを標準で内蔵しており、curlでシェルから直接LLMに問い合わせるパターンも広く使われています。ChatGPT(OpenAI API)もcurlとjqの2コマンドだけでターミナルから呼び出せます。
この記事では、curlの基本的な使い方から、POST/PUT/DELETEリクエスト、ヘッダ操作、認証、ファイルダウンロード、ローカルLLMと外部AI APIの操作まで実務で必要な操作を網羅します。
・curlはAPIリクエスト・ヘッダ確認・POST送信など、サーバー運用と開発の両方で使う万能ツール
・GET/POST/PUT/DELETEの基本から、JSON送信・Basic認証・Bearerトークンの実例までカバー
・
-vでのデバッグ、-wによるレスポンスタイム計測など、現場で役立つ実践Tipsも解説・ローカルLLM(Ollama)とChatGPT APIのどちらもcurlで操作できる — jqで回答テキストだけを取り出す定番パターンを解説
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
curlとは?
curl(Client URL)は、コマンドラインからHTTP/HTTPS/FTPなどのプロトコルでデータ転送を行うツールです。似たコマンドにwgetがありますが、用途が異なります。
・curl:APIリクエスト、ヘッダ確認、POST送信など多機能。スクリプトでの利用に強い
・wget:ファイルのダウンロードに特化。再帰ダウンロードが得意
APIの動作確認やWebサーバーのレスポンス検証にはcurlが適しています。最近ではOllamaなどのローカルLLMがHTTP REST APIを内蔵しており、curlでシェルから直接LLMに問い合わせるパターンも普及しています。ChatGPT(OpenAI API)もREST API形式を採用しているため、curlとjqがあればブラウザなしでターミナルからAIに質問できます。詳しくは後述のセクションで解説します。
curlのインストール確認と導入方法
作業を始める前に、curlが使える状態かを確認します。多くのLinuxディストリビューションでは最初からインストールされていますが、最小構成のVPSや新規セットアップ直後の環境では手動での導入が必要な場合があります。# バージョンを確認する $ curl --version curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 Release-Date: 2022-01-05 Protocols: dict file ftp ftps gopher gophers http https ...
# Ubuntu / Debian / WSL2 の場合 sudo apt update && sudo apt install -y curl # Rocky Linux / AlmaLinux / RHEL9 の場合 sudo dnf install -y curl
基本的な使い方
1. URLの内容を取得する(GET)
最もシンプルな使い方です。URLを指定するだけで、レスポンスのボディが標準出力に表示されます。# Webページの内容を取得 curl https://example.com # HTTPSの証明書エラーを無視する(テスト環境向け) curl -k https://self-signed.example.com
2. レスポンスヘッダを確認する(-I / -i)
Webサーバーの設定確認やトラブル調査でよく使います。# レスポンスヘッダだけ表示(HEAD リクエスト) curl -I https://example.com HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 1256 Server: nginx/1.24.0 # ヘッダ+ボディの両方を表示 curl -i https://example.com
3. ファイルをダウンロードする(-o / -O)
# ファイル名を指定して保存 curl -o localfile.tar.gz https://example.com/archive.tar.gz # URLのファイル名でそのまま保存 curl -O https://example.com/archive.tar.gz # ダウンロードの進捗を非表示にする(スクリプト向け) curl -sO https://example.com/archive.tar.gz
4. リダイレクトに追従する(-L)
HTTPリダイレクト(301/302)が返された場合、デフォルトではcurlは追従しません。-Lオプションで自動的に追従します。# リダイレクト先まで追従して取得 curl -L https://example.com/old-page
POST/PUT/DELETEリクエスト
1. POSTでデータを送信する(-d / -X POST)
フォームデータやJSON形式でデータを送信します。# フォームデータを送信 curl -d "name=miyazaki&email=test@example.com" https://example.com/api/users # JSONデータを送信 curl -X POST https://example.com/api/users -H "Content-Type: application/json" -d '{"name":"miyazaki","email":"test@example.com"}'
2. PUTでデータを更新する
curl -X PUT https://example.com/api/users/1 -H "Content-Type: application/json" -d '{"name":"updated_name"}'
3. DELETEでリソースを削除する
curl -X DELETE https://example.com/api/users/1
応用・実務Tips
1. カスタムヘッダを付与する(-H)
APIの認証トークンやカスタムヘッダを送信する場合に使います。# Authorizationヘッダを付与 curl -H "Authorization: Bearer your_token_here" https://example.com/api/data # 複数のヘッダを指定 curl -H "Content-Type: application/json" -H "Accept: application/json" https://example.com/api/data
2. Basic認証を使う(-u)
# ユーザー名:パスワードで認証 curl -u admin:password https://example.com/admin/ # パスワードを対話式で入力(コマンド履歴に残さない) curl -u admin https://example.com/admin/
3. レスポンスタイムを計測する(-w)
Webサーバーのパフォーマンス調査に使えるテクニックです。# 接続時間・転送時間・合計時間を計測 curl -o /dev/null -s -w "DNS: %{time_namelookup}s Connect: %{time_connect}s Total: %{time_total}s " https://example.com DNS: 0.012s Connect: 0.045s Total: 0.156s
4. 出力を整形する(jqとの組み合わせ)
JSON形式のAPIレスポンスを見やすく整形するには、jqコマンドにパイプします。jqはAI APIの応答を扱う際にも必須です。# jqをインストールする(Ubuntu / Debian / WSL2の場合) sudo apt install -y jq # Rocky Linux / AlmaLinux / RHEL系の場合 sudo dnf install -y jq # バージョン確認 jq --version jq-1.6 # JSONレスポンスを整形表示 curl -s https://example.com/api/data | jq . # 特定のフィールドだけ抽出 curl -s https://example.com/api/users | jq '.[].name'
5. プロキシ経由でアクセスする(-x)
# HTTPプロキシ経由でアクセス curl -x http://proxy.example.com:8080 https://example.com
ローカルLLM(Ollama)のAPIをcurlで操作する
OllamaはインストールするだけでHTTPサーバーが自動起動し、http://localhost:11434でREST APIが使えます。curlでJSONを送るだけでターミナルから直接LLMに問い合わせられるため、シェルスクリプトへの組み込みや自動化に便利です。1. Ollamaが起動していることを確認する
curlでAPIを呼ぶ前に、Ollamaサーバーが動いているかを確認します。$ curl http://localhost:11434 Ollama is running
ollama serveコマンドで起動してください。インストール済みのモデル一覧は
/api/tagsエンドポイントで確認できます。$ curl -s http://localhost:11434/api/tags | jq '.models[].name' "llama3.2:latest" "mistral:latest"
2. stream: false で一括レスポンスを取得する
OllamaのAPIはデフォルトでストリーミング形式(1トークンずつ流れる)になっています。シェルスクリプトで扱うには"stream": falseを指定して一括取得するのが基本です。$ curl -s http://localhost:11434/api/generate -d '{"model":"llama3.2","prompt":"Linuxのlsコマンドを一行で説明してください","stream":false}' { "model": "llama3.2", "created_at": "2026-09-10T08:15:03.221Z", "response": "lsコマンドは、カレントディレクトリまたは指定したディレクトリの内容を表示するLinuxの基本コマンドです。", "done": true, "total_duration": 4521098000, "eval_count": 32 }
3. jqで回答テキストだけを取り出す
レスポンスにはtotal_durationなど余分なフィールドが多いため、jqでresponseフィールドだけを取り出すのが定番パターンです。$ curl -s http://localhost:11434/api/generate -d '{"model":"llama3.2","prompt":"Linuxのlsコマンドを一行で説明してください","stream":false}' | jq -r '.response' lsコマンドは、カレントディレクトリまたは指定したディレクトリの内容を表示するLinuxの基本コマンドです。
jq -r '.response'の-rは raw output の指定です。JSONのダブルクォートが外れ、純粋なテキストとして出力されます。注意: OllamaのAPIはデフォルトでlocalhost(127.0.0.1)のみにバインドされています。VPSで外部公開する場合は、ファイアウォールで接続元IPを制限するなど、アクセス制御を必ず設定してください。
クラウドLLM(ChatGPT API)をcurlで操作する
ローカルのOllamaだけでなく、OpenAIのChatGPT APIもcurlで操作できます。API形式はREST+JSONで同じ考え方です。APIキーさえあれば、インストール不要でターミナルから直接ChatGPTに質問できます。1. APIキーを環境変数に設定する
APIキーをコマンドに直接書き込むと、コマンド履歴から漏れる危険があります。export OPENAI_API_KEY="sk-proj-..." のように値ごと打ち込むと、その行がそのまま履歴(~/.bash_history)に残ります。キーはread -sで画面に表示せずに入力し、環境変数に入れて使いましょう。# APIキーを画面に表示せずに入力し、環境変数に設定する(ターミナルを閉じると消える) read -rsp 'APIキー: ' OPENAI_API_KEY && echo && export OPENAI_API_KEY # 永続化する場合は、自分だけが読める専用ファイル(権限600)に保存する mkdir -p ~/.config/openai touch ~/.config/openai/env chmod 600 ~/.config/openai/env printf 'export OPENAI_API_KEY="%s" ' "$OPENAI_API_KEY" > ~/.config/openai/env # ~/.bashrc には読み込み設定だけを追記する(キー本体は書かない) echo '[ -f ~/.config/openai/env ] && . ~/.config/openai/env' >> ~/.bashrc source ~/.bashrc # 設定確認(キーの値は表示せず、「設定済み」と表示されれば完了) [ -n "$OPENAI_API_KEY" ] && echo 設定済み
・read -rsp 'APIキー: ':入力した文字を画面に表示せずに変数へ読み込む。キーの値がコマンド行に現れないため、履歴にも残らない
・chmod 600:所有者だけが読み書きできる権限にする。~/.bashrc は通常ほかのユーザーも読める権限(644)のため、キーは専用ファイルに分けて保存する
・[ -n "$OPENAI_API_KEY" ] && echo 設定済み:変数が空でないことだけを確かめる。
echo $OPENAI_API_KEY はキー全文が画面に出るため、画面共有や録画の最中に使わない2. curlでChatGPT APIに質問する
curl -s https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer $OPENAI_API_KEY" -d '{ "model": "gpt-4o-mini", "messages": [ {"role": "user", "content": "Linuxのlsコマンドの基本的な使い方を教えてください。"} ] }'
・-H "Authorization: Bearer ...":APIキーで認証する(Bearer認証という方式)
・-d '...':モデル名と質問内容をJSON形式で指定する
・"model": "gpt-4o-mini":使用するモデル(安価で高速な入門向けモデル)
成功すると次のようなJSONが返ってきます。
{ "id": "chatcmpl-BvXrQw7M2kL9nPjF3eH5sT1", "object": "chat.completion", "created": 1756403127, "model": "gpt-4o-mini-2024-07-18", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "lsコマンドはディレクトリの内容(ファイルやサブディレクトリの一覧)を表示する基本コマンドです。" }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 38, "completion_tokens": 26, "total_tokens": 64 } }
choices[0].message.contentの中に入っています。jqで回答テキストだけを取り出す方法は次のセクションで解説します。注意: curlの実行中は、展開されたキーがプロセス一覧(
psコマンドの表示)にそのまま出ます。自分しかログインしないPCやVPSなら大きな問題になりませんが、複数人で使うサーバーでは「Authorization: Bearer キー」の1行を権限600のファイルに書き、-H @ファイル名で読み込ませてください(curl 7.55.0以降)。3. jq -r で回答テキストだけを取り出す
curlとjqをパイプでつなぐことで、JSONレスポンスからAIの返答テキストだけを取り出せます。curl -s https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer $OPENAI_API_KEY" -d '{ "model": "gpt-4o-mini", "messages": [ {"role": "user", "content": "Linuxのlsコマンドの基本的な使い方を教えてください。"} ] }' | jq -r '.choices[0].message.content'
jq -r '.choices[0].message.content'の-rは raw output の指定です。JSONのダブルクォートが外れ、純粋なテキストとして出力されます。4. シェルスクリプトで「askコマンド」を作る
毎回長いcurlコマンドを打つのは手間です。スクリプトにまとめればask "質問"の形で呼び出せます。# ~/bin/ask スクリプトを作成する mkdir -p ~/bin cat > ~/bin/ask << 'SCRIPT' #!/bin/bash QUESTION="${1}" if [ -z "$QUESTION" ]; then echo '使い方: ask "質問内容"' >&2 exit 1 fi # 質問文はjqでJSONに組み立て、パイプ経由でcurlに渡す jq -nc --arg q "$QUESTION" '{model: "gpt-4o-mini", messages: [{role: "user", content: $q}]}' | curl -s https://api.openai.com/v1/chat/completions -H "Content-Type: application/json" -H "Authorization: Bearer $OPENAI_API_KEY" -d @- | jq -r '.choices[0].message.content' SCRIPT # 実行権限を付与してPATHを通す chmod +x ~/bin/ask echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc source ~/.bashrc # 呼び出し例 ask "Linuxでファイルの行数を数えるコマンドは?"
・jq -nc --arg q "$QUESTION":質問文をJSONの文字列値として埋め込む。質問にダブルクォートや改行が含まれても、jqが自動でエスケープするのでJSONが壊れない
・-d @-:送信するJSONを標準入力(直前のjqの出力)から読み込む
・
-d "{"model":...,"content":"${QUESTION}"}" のように変数を文字列へ直接差し込む書き方は、質問にダブルクォートが入った時点で不正なJSONになるため避けるトラブルシュート・エラー対処
「curl: (60) SSL certificate problem」が出た時の対処法
SSL証明書の検証に失敗した場合のエラーです。# テスト環境で証明書エラーを無視する場合 curl -k https://self-signed.example.com # CA証明書を指定する場合 curl --cacert /path/to/ca-cert.pem https://example.com
「curl: (7) Failed to connect」が出た時の対処法
接続先のサーバーに到達できない場合のエラーです。# ネットワーク疎通を確認 ping example.com # ポートが開いているか確認 ss -tlnp | grep :443 # DNS解決を確認 dig example.com
「curl: (28) Connection timed out」が出た時の対処法
タイムアウトが発生した場合は、-m(最大時間)や --connect-timeout で調整できます。# 接続タイムアウトを10秒に設定 curl --connect-timeout 10 https://example.com # リクエスト全体のタイムアウトを30秒に設定 curl -m 30 https://example.com
「curl: command not found」が出た時の対処法
curlがインストールされていない状態です。環境に合わせてインストールしてください。# Ubuntu / Debian / WSL2 の場合 sudo apt update && sudo apt install -y curl # Rocky Linux / AlmaLinux / RHEL9 の場合 sudo dnf install -y curl
ChatGPT APIで「Unauthorized」エラーが出た時の対処法
{ "error": { "message": "Incorrect API key provided: sk-proj-**.", "type": "invalid_request_error", "code": "invalid_api_key" } }
[ -n "$OPENAI_API_KEY" ] && echo 設定済み で設定されているかを確認する(キーの値は画面に出さない)・環境変数が反映されていない →
source ~/.bashrc を実行してから再試行する・APIキーが失効している → OpenAIのダッシュボードで新しいキーを発行する
「429 Too Many Requests」エラーが出た時の対処法
OpenAI APIには1分あたりのリクエスト数に制限(レート制限)があります。連続して呼び出す場合は、少し時間を置いてから再試行してください。スクリプトで繰り返し呼び出す場合はsleep 2を挟むと安定します。-d のJSON記述でparse errorになる場合
-dオプションのJSONの書き方が間違っていると、APIサーバーがJSONをパースできずにエラーを返すことがあります。・JSONの外側はシングルクォート
'{ ... }'で囲む・JSON内部の文字列はダブルクォート
"..."を使う・改行を含む複数行のリクエストはバックスラッシュ
\で行継続する・変数を
-dに直接差し込む場合はjq -nc --argを使ってJSONを組み立て、-d @-で渡すと安全です(前述の「askコマンド」パターン参照)本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| curlのバージョンを確認する | curl --version |
| URLの内容を取得する | curl URL |
| レスポンスヘッダを確認する | curl -I URL |
| ファイルをダウンロードする | curl -O URL |
| リダイレクトに追従する | curl -L URL |
| POSTでJSONデータを送信する | curl -X POST -H "Content-Type: application/json" -d 'JSON' URL |
| カスタムヘッダを付与する | curl -H "ヘッダ名: 値" URL |
| Basic認証でアクセスする | curl -u ユーザー名 URL |
| レスポンスタイムを計測する | curl -o /dev/null -s -w "Total: %{time_total}s" URL |
| タイムアウトを設定する | curl --connect-timeout 10 URL |
| jqのバージョンを確認する | jq --version |
| OllamaのAPIに質問を送る(一括取得) | curl -s http://localhost:11434/api/generate -d '{"model":"llama3.2","prompt":"質問","stream":false}' |
| Ollamaの回答テキストだけを取り出す | curl -s http://localhost:11434/api/generate -d '...' | jq -r '.response' |
| ChatGPT APIに質問する | curl -s https://api.openai.com/v1/chat/completions -H "Authorization: Bearer $OPENAI_API_KEY" -d '...' |
| ChatGPTの回答テキストだけを取り出す | curl -s https://api.openai.com/v1/chat/completions -d '...' | jq -r '.choices[0].message.content' |
curlを使ったAPI連携を、現場レベルで扱えるようになりませんか?
curlはRESTful APIの動作確認から本番環境のヘルスチェックまで、Linuxエンジニアの日常に欠かせない道具です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 次のページへ:teeコマンドで標準出力とファイルに同時出力する方法|パイプと組み合わせたログ保存の実践例も
- 前のページへ:digコマンドでDNSを調査する方法|AレコードからDNSSECまで実務で使う引き方
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドA-E・ネットワーク・ネットワーク管理コマンドへ戻る

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