このチュートリアルでは、LinuxでのcURLコマンドについて説明します。この強力なユーティリティの機能と、その機能をすべて理解するのに役立つ例を紹介します。
cURLコマンドを使用して、サポートされている20以上のプロトコルの1つを使用して、サーバーにデータをダウンロードまたはアップロードできます。このデータは、ファイル、電子メールメッセージ、またはWebページである可能性があります。
cURLコマンドとは何ですか?
cURLは、WebサイトまたはAPIと対話し、要求を送信し、端末への応答を表示したり、データをファイルに記録したりするための理想的なツールです。より大きなスクリプトの一部として使用し、さらに処理するためにデータを他の関数に渡す場合があります。
cURLの主な用途は、サーバーからファイルを取得/ダウンロードすることです。この機能はうまく機能しますが、そのジョブにはwgetコマンドの方が適している場合があります。
この記事の後半で、wgetとcURLの相違点と類似点について説明します。
以下のセクションでcURLの使用方法を説明します。
ファイルをダウンロード
cURLに与えることができる最も基本的なコマンドは、Webサイトまたはファイルをダウンロードすることです。別のプロトコルを指定しない限り、cURLはデフォルトのプロトコルとしてHTTPを使用します。 Webサイトをダウンロードするには、次のコマンドを発行するだけです:
$ curl http://www.google.com
もちろん、取得したいWebサイトまたはページを入力してください。
このような基本的なコマンドを追加のオプションなしで実行すると、提供したページのソースコードを取得するようにcURLに指示するだけなので、ほとんど役に立ちません。
コマンドを実行すると、端末にはHTMLやその他のWebスクリプトコードが入力されます。このフォームで特に役立つものではありません。
代わりに、WebサイトをHTMLドキュメントとしてダウンロードして、コンテンツを表示できるようにします。これを実現するには、–outputオプションをcURLに追加します。
$ curl www.likegeeks.com --output likegeeks.html
これで、ダウンロードしたWebサイトを開いて、Webブラウザに表示できます。
オンラインファイルをダウンロードする場合、コマンドはほぼ同じです。ただし、上記の例で行ったように、必ず–outputオプションをcURLに追加してください。
そうしないと、cURLはオンラインファイルのバイナリ出力を端末に送信します。これにより、端末が誤動作する可能性があります。
500KBのWord文書のダウンロードを開始すると次のようになります。
ドキュメントという単語のダウンロードが開始され、ターミナルでのダウンロードの進行状況が表示されます。ダウンロードが完了すると、ファイルは保存したディレクトリで利用できるようになります。
この例では、ディレクトリを指定しなかったため、ファイルは現在の作業ディレクトリ(cURLコマンドを実行したディレクトリ)に保存されました。
また、cURLコマンドで指定した-Lオプションに気づきましたか?このファイルをダウンロードするために必要でした。次のセクションでその機能について説明します。
リダイレクトに従う
WebサイトをcURLしようとしたときに空の出力が表示される場合は、WebサイトがcURLに別のURLにリダイレクトするように指示したことを意味している可能性があります。デフォルトでは、cURLはリダイレクトに従いませんが、-Lスイッチを使用してリダイレクトすることができます。
$ curl -L www.likegeeks.com
この記事の調査では、大多数のWebサイトで-Lを指定する必要があることがわかったので、この小さなトリックを覚えておいてください。デフォルトでcURLコマンドの大部分に追加することもできます。
ダウンロードを停止して再開します
ダウンロードが中断された場合、または大きなファイルをダウンロードする必要があるが、すべてを1つのセッションで実行したくない場合は、cURLに転送を停止して再開するオプションがあります。
転送を手動で停止するには、ctrl + cの組み合わせを使用して、ターミナルで現在実行されているほとんどすべてのプロセスを停止するのと同じ方法でcURLプロセスを終了できます。
ダウンロードは開始されましたが、ctrl + cで中断されました。次に、次の構文でダウンロードを再開しましょう。
$ curl -C - example.com/some-file.zip --output MyFile.zip
-Cスイッチはファイル転送を再開するものですが、その直後にダッシュ(-)があることにも注意してください。これにより、cURLはファイル転送を再開しますが、ダウンロードされた最後のバイトを確認して再開する場所を決定するために、最初にダウンロード済みの部分を確認するように指示されます。
ファイル転送が再開され、ダウンロードが正常に完了しました。
タイムアウトを指定
cURLが一定時間後に実行を中止するようにしたい場合は、コマンドでタイムアウトを指定できます。これは、cURLの一部の操作にはデフォルトでタイムアウトがないため、特に便利です。そのため、無期限にハングアップしたくない場合は、タイムアウトを指定する必要があります。
-mスイッチを使用して、コマンドの実行に費やす最大時間を指定できます。指定された時間が経過すると、ファイルのダウンロードまたはアップロードの途中であっても、cURLは実行中の処理をすべて終了します。
cURLは、最大時間が秒単位で指定されることを想定しています。したがって、1分後にタイムアウトするには、コマンドは次のようになります。
$ curl -m 60 example.com
cURLで指定できる別のタイプのタイムアウトは、接続に費やす時間です。これにより、cURLが、オフラインまたはその他の方法で到達できないホストへの接続に不当な時間を費やさないようにすることができます。
引数として秒を受け入れます:
$ curl --connect-timeout 60 example.com
ユーザー名とパスワードの使用
-uスイッチを使用して、cURLコマンドでユーザー名とパスワードを指定できます。たとえば、FTPサーバーで認証する場合、構文は次のようになります。
$ curl -u username:password ftp://example.com
これはどのプロトコルでも使用できますが、FTPはこのような単純なファイル転送に頻繁に使用されます。
上のスクリーンショットに表示されているファイルをダウンロードする場合は、同じコマンドを発行しますが、ファイルへのフルパスを使用します。
$ curl -u username:password ftp://example.com/readme.txt
プロキシを使用する
ホストに接続する前に、プロキシを使用するようにcURLに指示するのは簡単です。特に指定しない限り、cURLはデフォルトでHTTPプロキシを想定します。
-xスイッチを使用してプロキシを定義します。この例ではプロトコルが指定されていないため、cURLはそれがHTTPプロキシであると想定します。
$ curl -x 192.168.1.1:8080 http://example.com
このコマンドは、example.comに接続するためのプロキシとしてポート8080の192.168.1.1を使用します。
他のプロトコルでも使用できます。これは、HTTPプロキシを使用してFTPサーバーにcURLを送信し、ファイルを取得する場合の例です。
$ curl -x 192.168.1.1:8080 ftp://example.com/readme.txt
cURLは、他の多くのタイプのプロキシとそれらのプロキシで使用するオプションをサポートしていますが、さらに拡張することは、このガイドの範囲を超えています。プロキシトンネリング、SOCKSプロキシ、認証などの詳細については、cURLのmanページを確認してください。
チャンクダウンロードの大きなファイル
ファイル転送を停止および再開する方法についてはすでに説明しましたが、cURLでファイルのチャンクのみをダウンロードしたい場合はどうでしょうか。そうすれば、大きなファイルを複数のチャンクでダウンロードできます。
ダウンロードの上限などを下回る必要がある場合に備えて、ファイルの特定の部分のみをダウンロードすることができます。これを実現するには、–rangeフラグを使用できます。
サイズはバイト単位で書き込む必要があります。したがって、最新のUbuntu.isoファイルを100MBのチャンクでダウンロードする場合、最初のコマンドは次のようになります。
$ curl --range 0-99999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part1
2番目のコマンドは、次のバイトを取得して、さらに100MBのチャンクをダウンロードする必要があります。
$ curl --range 0-99999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part1
$ curl --range 100000000-199999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part2
cURLがすべてのチャンクをダウンロードするまで、このプロセスを繰り返します。最後のステップは、チャンクを1つのファイルに結合することです。これは、catコマンドで実行できます。
$ cat ubuntu-part? > ubuntu-18.04.3-desktop-amd64.iso
クライアント証明書
基本認証の代わりに証明書認証を使用してサーバーにアクセスするには、–certオプションを使用して証明書ファイルを指定できます。
$ curl --cert path/to/cert.crt:password ftp://example.com
cURLには、証明書ファイルの形式に関する多くのオプションがあります。
証明書に関連するオプションも他にもあります:–cacert、–cert-status、–cert-typeなど。オプションの完全なリストについては、manページを確認してください。
サイレントcURL
cURLの進行状況メーターとエラーメッセージを抑制したい場合は、-sスイッチがその機能を提供します。要求したデータは引き続き出力されるため、コマンドを100%サイレントにする場合は、出力をファイルに送信する必要があります。
このコマンドを-Oフラグと組み合わせて、現在の作業ディレクトリにファイルを保存します。これにより、cURLが0の出力で返されるようになります。
$ curl -s -O http://example.com
または、–outputオプションを使用して、ファイルを保存する場所を選択し、名前を指定することもできます。
$ curl -s http://example.com --output index.html
ヘッダーを取得
リモートアドレスのヘッダーを取得するのはcURLを使用すると非常に簡単で、-Iオプションを使用するだけです。
$ curl -I example.com
これを–Lオプションと組み合わせると、cURLはリダイレクト先のすべてのアドレスのヘッダーを返します。
$ curl -I -L example.com
複数のヘッダー
-Hオプションを使用して、ヘッダーをcURLに渡すことができます。また、複数のヘッダーを渡すには、-Hオプションを複数回使用する必要があります。次に例を示します:
$ curl -H 'Connection: keep-alive' -H 'Accept-Charset: utf-8 ' http://example.com
投稿(アップロード)ファイル
POSTは、Webサイトがデータを受け入れるための一般的な方法です。たとえば、オンラインでフォームに入力する場合、POSTメソッドを使用してブラウザからデータが送信されている可能性があります。この方法でデータをWebサイトに送信するには、-dオプションを使用します。
$ curl -d 'name=geek&location=usa' http://example.com
テキストではなくファイルをアップロードする場合、構文は次のようになります。
$ curl -d @filename http://example.com
アップロードしようとしているすべての異なるデータまたはファイル名を指定するには、必要な数の-dフラグを使用します。
FTPサーバーにファイルをアップロードする場合は、-Tオプションを使用できます。
$ curl -T myfile.txt ftp://example.com/some/directory/
メールを送信
電子メールの送信とは、コンピューター(または別のデバイス)から電子メールサーバーにデータをアップロードすることです。 cURLはデータをアップロードできるため、これを使用してメールを送信できます。多数のオプションがありますが、SMTPサーバーを介してメールを送信する方法の例を次に示します。
$ curl smtp://mail.example.com --mail-from [email protected] --mail-rcpt [email protected] --upload-file email.txt
メールファイルを正しくフォーマットする必要があります。このようなもの:
$ cat email.txt From: Web Administrator <[email protected]> To: John Doe <[email protected]> Subject: An example email Date: Sat, 7 Dec 2019 02:10:15 John, Hope you have a great weekend. -Admin
いつものように、よりきめ細かく専門的なオプションは、cURLのマニュアルページにあります。
メールメッセージを読む
cURLはIMAP(およびIMAPS)とPOP3をサポートしており、両方を使用してメールサーバーからメールメッセージを取得できます。
次のようにIMAPを使用してログインします:
$ curl -u username:password imap://mail.example.com
このコマンドは、使用可能なメールボックスを一覧表示しますが、特定のメッセージは表示しません。これを行うには、–Xオプションを使用してメッセージのUIDを指定します。
$ curl -u username:password imap://mail.example.com -X 'UID FETCH 1234'
cURLとwgetの違い
cURLとwgetはどちらもサーバーからデータを取得できるため、混同されることがあります。しかし、これが彼らに共通している唯一のものです。
この記事では、cURLの機能について説明しました。 wgetは異なる関数のセットを提供します。 wgetは、Webサイトをダウンロードするための最良のツールであり、ディレクトリとリンクを再帰的にトラバースしてサイト全体をダウンロードすることができます。
Webサイトのダウンロードには、wgetを使用します。 HTTPまたはHTTPS以外のプロトコルを使用する場合、またはファイルをアップロードする場合は、cURLを使用します。 cURLは、Webから個々のファイルをダウンロードするための優れたオプションでもありますが、wgetでもそれは問題ありません。
チュートリアルがお役に立てば幸いです。戻ってきてください。