Linuxコマンド - curl

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

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や遷移を調査することができる。
  • プロキシを経由したリクエスト
    プロキシサーバを経由してリクエストを送信することができる。



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リクエスト送信
curl -X POST -d “data=value” https://example.com

PUTリクエストの送信
curl -X PUT -d “data=new_value” https://example.com/resource/1

DELETEリクエストの送信
curl -X DELETE https://example.com/resource/1



セキュリティと認証

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

タイムアウト時間を伸ばす、または、サーバの応答速度を改善する。