Linuxコマンド - curl
概要
curl
コマンドは、Web上のリソースにアクセスして、データの送受信を行うツールである。
主に、以下に示すようなプロトコルをサポートしており、APIとの通信やWebページの取得、ファイルのアップロードおよびダウンロード等の操作が可能である。
- HTTP
- HTTPS
- FTP
- SFTP
curl
コマンドは、以下に示すことが可能である。
- Webページの取得
- WebページのHTMLコンテンツを取得する。
- APIとの通信
- APIに対してHTTPリクエストを送信して、データの取得や更新、削除を行う。
- ファイルのアップロード / ダウンロード
- FTP、SFTP、HTTP、HTTPS等のプロトコルを利用して、ファイルのアップロードやダウンロードを行う。
- ヘッダ情報の確認
- WebサイトやAPIのHTTPヘッダー情報を確認する。
- 認証付きリクエスト
- Basic認証、Digest認証、トークン認証等の様々な認証方法に対応したリクエストを送信することができる。
- Webサイトの監視
- 定期的にWebサイトやAPIにリクエストを送信して、ステータスコードや応答時間を監視することができる。
- リダイレクトの追跡
- URLがリダイレクトされる場合、
curl
コマンドはリダイレクト先のURLや遷移を調査することができる。
- URLがリダイレクトされる場合、
- プロキシを経由したリクエスト
- プロキシサーバを経由してリクエストを送信することができる。
curlのインストール
多くのLinuxディストリビューションでは、標準でcurlがインストールされている。
パッケージ管理システムからインストール
# RHEL sudo dnf install curl # SUSE sudo zypper install curl
ソースコードからインストール
もし、別途インストールする必要がある場合、ソースコードからcurlをインストールする。
curlのビルドに必要なライブラリをインストールする。
# SUSE sudo zypper install make cmake gcc perl libopenssl-devel libopenssl-1_1-devel libzstd-devel c-ares-devel libpsl-devel \ libssh-devel # オプション : libSSHライブラリを使用する場合 libssh2-devel # オプション : libSSH2ライブラリを使用する場合 libgnutls-devel # オプション : GNU TLSライブラリを使用する場合 mbedtls-devel # オプション : Mbed TLSライブラリを使用する場合 libnghttp2-devel # オプション : NGHTTPライブラリを使用する場合 libheimdal-devel # オプション : GSSを使用する場合
curlの公式Webサイト、または、curlのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。
tar xf curl-<バージョン>.tar.xz cd curl-<バージョン>
curlをビルドおよびインストールする。
mkdir build && cd build # Configureスクリプトを使用する場合 ../configure --prefix=<curlのインストールディレクトリ> \ --with-openssl \ --with-gnutls # オプション : GNUTLSを使用する場合 --with-wolfssl # オプション : WolfSSLを使用する場合 # CMakeを使用する場合 cmake .. -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=<CURLのインストールディレクトリ> \ -DENABLE_ARES=ON \ # C Aresを有効にする場合 -DCURL_USE_GNUTLS=ON \ # GNU TLSを有効にする場合 -DCURL_USE_MBEDTLS=ON \ # Mbed TLSを有効にする場合 -DCURL_USE_WOLFSSL=ON \ # Wolf SSLを有効にする場合 -DUSE_NGHTTP2=ON \ # NG Httpを有効にする場合 -DCURL_USE_GSSAPI=ON # GSS APIを有効にする場合 make -j $(nproc) make install
~/.profileファイル等に、環境変数PATH
を追記する。
vi ~/.profile
# ~/.profileファイル export PATH="/<curlのインストールディレクトリ>/bin:$PATH"
使用方法
GETリクエストの実行
curl <オプション> <URL> # 例: DuckDuckGoのトップページのHTMLを取得する場合 curl https://duckduckgo.com
ヘッダ情報の表示
ヘッダ情報だけを表示する場合は、-I
オプションを付加する。
curl -I <URL>
POSTリクエストの送信
POSTリクエストを送信する場合は、以下に示す2つのオプションを付加する。
-X
オプション- : メソッドを指定(POST)
-d
オプション- : データを指定
curl -X POST -d "key=<値>" <URL>
ファイルのアップロード
ファイルをアップロードする場合は、-F
オプションを付加する。
curl -F "file=@<ファイルのパス>" <URL>
ファイルのダウンロード
ファイルをダウンロードする場合は、-o
オプションを付加して保存先ファイル名を指定する。
curl -o <出力先ファイル名> <URL>
curlコマンドのオプション
オプション | 説明 | 実行例 |
---|---|---|
-A --user-agent |
UAを指定する。 | curl -A "Mozilla/5.0" https://example.com |
-b --cookie |
クッキーを指定する。 | curl -b "name=value" https://example.com |
-c --cookie-jar |
取得したクッキーをファイルに保存する。 | curl -c cookies.txt https://example.com |
-d --data |
POSTリクエストで送信するデータを指定する。 | curl -d "data=value" https://example.com |
-D --dump-header |
レスポンスヘッダをファイルに保存する。 | curl -D headers.txt https://example.com |
-F --form |
フォームデータを送信する。 | curl -F "file=@file.txt" https://example.com |
-H --header |
カスタムヘッダを追加する。 | curl -H "Content-Type: application/json" https://example.com |
-I --head |
ヘッダ情報のみを表示する。 | curl -I https://example.com |
-k --insecure |
SSL / TLS認証を無視する。 | curl -k https://example.com |
-L --location |
リダイレクト先に追従する。 | curl -L https://example.com |
-o --output |
取得したデータをファイルに保存する。 | curl -o output.html https://example.com |
-O --remote-name |
URLのファイル名でファイルを保存する。 | curl -O https://example.com/file.zip |
-s --silent |
サイレントモードを有効にする。 | curl -s https://example.com |
-u --user |
ユーザ名とパスワードを指定して認証を行う。 | curl -u username:password https://example.com |
-x --proxy |
プロキシサーバを指定する。 | curl -x http://proxy.example.com:8080 https://example.com |
-X --request |
HTTPメソッド(GET, POST, PUT, DELETE) |
POSTリクエスト送信 |
セキュリティと認証
HTTPS
証明書のエラーを無視する場合、-k
オプションを付加する。
これにより、curl
コマンドはサーバから送信される証明書を検証せずに、以下のような動作をする。
- 証明書エラーが発生しない。
- サーバとの通信が脆弱になる
- サーバからのレスポンスが改竄されている可能性がある。
パスワード認証
ユーザ名とパスワードを指定して認証が必要なWebサイトにアクセスする場合は、-u
オプションを付加する。
curl -u <ユーザ名>:<パスワード> <URL>
トークン認証
トークン認証を使用するAPIにアクセスする場合は、ヘッダにトークンを追加してリクエストを送信する。
curl -H "Authorization: Bearer YOUR_ACCESS_TOKEN" https://api.example.com/data
Basic認証 / Digest認証
Basic認証およびDigest認証を使用する場合は、-u
オプションを付加してユーザ名とパスワードを指定する。
また、必要に応じて-basic
オプションや-digest
オプションを付加する。
# Basic認証 curl -u <ユーザ名>:<パスワード> --basic <URL> # Digest認証 curl -u <ユーザ名>:<パスワード> --digest <URL>
SSL / TLSの設定
SSL / TLSの設定をカスタマイズする場合は、以下に示すオプションを付加する。
-ciphers
オプション- 使用する暗号スイートを指定する。
-cacert
オプション- CA証明書のファイルを指定する。
-cert
オプション- クライアント証明書を指定する。
-key
オプション- クライアント証明書の秘密鍵を指定する。
プロキシの設定
プロキシ経由でリクエストを送信する場合は、-x
オプションを付加してプロキシサーバのアドレスを指定する。
curl -x <プロキシサーバのURL> <URL>
ファイル転送
FTP / SFTPでのファイルアップロード
# FTP curl -u <ユーザ名>:<パスワード> -T <アップロードするファイル名> ftp://〜 # SFTP curl -u <ユーザ名>:<パスワード> -T <アップロードするファイル名> sftp://〜
FTP/SFTPでのファイルダウンロード
# FTPダウンロード curl -u <ユーザ名>:<パスワード> -o <保存するファイル名> ftp://〜/<ファイル名> # SFTPダウンロード curl -u <ユーザ名>:<パスワード> -o <保存するファイル名> sftp://〜/<ファイル名>
一括ダウンロード
複数のファイルを一括でダウンロードする場合は、-O
オプションを付加して、複数のURLを指定する。
curl -O https://〜/<ファイル名> -O https://〜/<ファイル名>
タイムアウトの設定
リクエストのタイムアウトを設定する場合は、-m
オプションを付加して、秒数を指定する。
curl -m <秒数> <URL>
通信速度の最適化
curl
コマンドのオプションを組み合わせることにより、様々な通信状況に対応した最適化が可能である。
例えば、低速な回線で大量のデータをダウンロードする場合は、以下に示すようなオプションを付加する。
-retry
- 転送が失敗した場合のリトライ回数を指定する。
-retry-delay
オプション- リトライする場合の待ち時間を指定する。
-connect-timeout
- 接続のタイムアウト時間を指定する。
curl --limit-rate <転送速度の上限> --compressed --retry <リトライ回数> --retry-delay <リトライ時の待ち時間> --connect-timeout <タイムアウト時間(秒)> <URL> # 実行例 # 転送速度を50KB/sに制限、圧縮転送を行い、最大3回のリトライ、リトライの間隔は5秒、接続のタイムアウト時間は10秒 curl --limit-rate 50K --compressed --retry 3 --retry-delay 5 --connect-timeout 10 https://example.com
エラー関連
Could not resolve host: <URL>
まず、PCが正常にインターネット接続されているかどうかを確認する。
次に、URLが正しいかどうかを確認する。
Failed to connect to <URL>.com port <ポート番号>: Connection refused
まず、ポート番号が正しいかどうかを確認する。
次に、接続先のサーバが稼働しているかどうかを確認する。
Operation timed out after 30000 milliseconds with 0 bytes received
タイムアウト時間を伸ばす、または、サーバの応答速度を改善する。