CURLでファイルをダウンロードする方法

提供:Dev Guides
移動先:案内検索

クライアントURL(cURL)は、システム間でデータを転送するためのライブラリおよびコマンドラインユーティリティです。 多くのプロトコルをサポートし、多くのUnixライクなオペレーティングシステムにデフォルトでインストールされる傾向があります。 一般に入手可能であるため、特にサーバー環境でローカルシステムにファイルをダウンロードする必要がある場合に最適です。

このチュートリアルでは、curlコマンドを使用して、Webサーバーからテキストファイルをダウンロードします。 その内容を表示してローカルに保存し、ファイルが移動した場合はリダイレクトに従うようにcurlに指示します。

インターネットからファイルをダウンロードするのは危険な場合があるため、信頼できるソースからダウンロードしていることを確認してください。 このチュートリアルでは、DigitalOceanからファイルをダウンロードし、ダウンロードしたファイルは実行しません。

インタラクティブターミナルを起動します!

ステップ1—リモートファイルを取得する

箱から出して、コマンドライン引数なしで、curlコマンドはファイルをフェッチし、その内容を標準出力に表示します。

Digitalocean.comからrobots.txtファイルをダウンロードして試してみましょう。

curl https://www.digitalocean.com/robots.txt

画面にファイルの内容が表示されます。

OutputUser-agent: *
Disallow:

sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

curlにURLを指定すると、リソースがフェッチされ、その内容が表示されます。

リモートファイルの保存

ファイルを取得してその内容を表示することはすべてうまくいきますが、実際にファイルをシステムに保存したい場合はどうでしょうか。

ダウンロード元のサーバーと同じファイル名でリモートファイルをローカルシステムに保存するには、--remote-name引数を追加するか、-Oオプションを使用します。

curl -O https://www.digitalocean.com/robots.txt

ファイルがダウンロードされます:

Output  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   286    0   286    0     0   5296      0 --:--:-- --:--:-- --:--:--  5296

curlは、ファイルの内容を表示する代わりに、テキストベースの進行状況メーターを表示し、リモートファイルの名前と同じ名前でファイルを保存します。 catコマンドで確認できます。

cat robots.txt

このファイルには、以前に見たものと同じ内容が含まれています。

OutputUser-agent: *
Disallow:

sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

次に、ダウンロードしたファイルのファイル名を指定してみましょう。

ステップ2—特定のファイル名でリモートファイルを保存する

リモートサーバー上のファイルと同じ名前のローカルファイルがすでにある可能性があります。

同じ名前のローカルファイルが上書きされないようにするには、-oまたは--output引数に続けて、コンテンツを保存するローカルファイルの名前を使用します。

次のコマンドを実行して、リモートのrobots.txtファイルをローカルの名前のdo-bots.txtファイルにダウンロードします。

curl -o do-bots.txt  https://www.digitalocean.com/robots.txt

もう一度、進行状況バーが表示されます。

Output  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   286    0   286    0     0   6975      0 --:--:-- --:--:-- --:--:--  7150

次に、catコマンドを使用してdo-bots.txtの内容を表示し、ダウンロードしたファイルであることを確認します。

cat do-bots.txt

内容は同じです:

OutputUser-agent: *
Disallow:

sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

デフォルトでは、curlはリダイレクトに従わないため、ファイルが移動すると、期待どおりの結果が得られない場合があります。 それを修正する方法を見てみましょう。

ステップ3—リダイレクトに従う

これまでのすべての例には、https://プロトコルを含む完全修飾URLが含まれています。 たまたまrobots.txtファイルをフェッチしようとして、www.digitalocean.comのみを指定した場合、DigitalOceanはリクエストをhttp://からhttps://にリダイレクトするため、出力は表示されません。 :

これは、-Iフラグを使用して確認できます。このフラグは、ファイルの内容ではなく、要求ヘッダーを表示します。

curl -I www.digitalocean.com/robots.txt

出力は、URLがリダイレクトされたことを示しています。 出力の最初の行はそれが移動されたことを示し、Location行は次の場所を示します。

OutputHTTP/1.1 301 Moved Permanently
Cache-Control: max-age=3600
Cf-Ray: 65dd51678fd93ff7-YYZ
Cf-Request-Id: 0a9e3134b500003ff72b9d0000000001
Connection: keep-alive
Date: Fri, 11 Jun 2021 19:41:37 GMT
Expires: Fri, 11 Jun 2021 20:41:37 GMT
Location: https://www.digitalocean.com/robots.txt
Server: cloudflare
. . .

curlを使用して手動で別のリクエストを行うか、--locationまたは-L引数を使用して、curlにリクエストを新しい場所にやり直すように指示できます。リダイレクトが発生したときはいつでも。 試してみる:

curl -L www.digitalocean.com/robots.txt

今回は、curlがリダイレクトに従ったため、出力が表示されます。

OutputUser-agent: *
Disallow:

sitemap: https://www.digitalocean.com/sitemap.xml
sitemap: https://www.digitalocean.com/community/main_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/questions_sitemap.xml.gz
sitemap: https://www.digitalocean.com/community/users_sitemap.xml.gz

-L引数を前述の引数のいくつかと組み合わせて、ファイルをローカルシステムにダウンロードできます。

curl -L -o do-bots.txt www.digitalocean.com/robots.txt

警告:オンラインの多くのリソースでは、curlを使用してスクリプトをダウンロードして実行するように求められます。 ダウンロードしたスクリプトを実行する前に、実行可能にして実行する前に、スクリプトの内容を確認することをお勧めします。 lessコマンドを使用してコードを確認し、実行したいものであることを確認します。


結論

curlを使用すると、リモートシステムからファイルをすばやくダウンロードできます。 curlは多くの異なるプロトコルをサポートし、データを送受信するためのリモートAPIとの対話など、より複雑なWebリクエストを作成することもできます。

man curlを実行して、curlのマニュアルページを表示すると、詳細を確認できます。