
cURL を使用してコマンドラインからリモート ファイルをダウンロードする
強力なコマンドラインツールであるcurlを使えば、ほぼあらゆるリモートサーバーからファイルをダウンロードできます。長年コマンドラインを使っている方なら、このツールが様々な状況で役立つことはご存知でしょう。しかし、シンプルに考えると、Mac OS X(またはLinux)のGUI側からWebブラウザやFTPクライアントを使うよりも、curlを使ったファイルのダウンロードの方が速いと感じる方も多いでしょう。これはローカル環境では便利ですが、SSH接続でリモートのMacにファイルをダウンロードする必要がある場合は特に便利です。
このチュートリアルでは、主にHTTPとSFTPという2つの一般的なプロトコルからのファイルのダウンロードに焦点を当てますが、cURLは他にも多くのプロトコルをサポートしていることに留意してください。curlは使いやすいですが、コマンドラインに関する知識をある程度身に付けておくことをお勧めします。
curl -O で完全一致ファイルをダウンロードする
curl で大文字の -O フラグを使用すると、正確なファイル名を維持しながらリモート サーバーからファイルをダウンロードします。その基本的な構文は次のとおりです。
curl -O [url]
つまり、指定されたURLファイルの名前が「sample.zip」の場合、ダウンロードされるファイル名は「sample.zip」になります。また、リモートサーバー上のファイル名が「LongExampleFileNameForOSXDaily-v-1-3-51-revision-515b12-readme.txt」のように非常に長く複雑な名前の場合、ローカルマシン上にはその名前で保存されます。長いファイル名は、-Oフラグではなく-oフラグを使用する方が適切な場合が多いです。これについては後ほど説明します。
定期的に読んでいる方は、m3u ストリーミング ファイルから実際のオーディオ コンテンツを抽出する方法を説明する際に curl -O コマンドを使用したことを覚えているかもしれません。
curl を使用してダウンロードを開始すると、転送率、ダウンロードにかかった時間と残り時間、転送速度が表示されます。
スクリーンショットは、以下に貼り付けた例よりもわかりやすく表現されていますが、次のようになります。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 10505 100 10505 0 0 79741 0 --:--:-- --:--:-- --:--:-- 142k
転送速度が表示されている場合は、curl の出力を /dev/null にリダイレクトして、インターネット接続速度をテストするために使用できますが、wget コマンドには読みやすく追跡しやすい転送バーがあるため、このタスクには wget の方が適しています。
curl -o でリモートファイルを別の名前で保存する
小文字の -o フラグを使用すると、ダウンロードしたファイルにリモートサーバー上のファイル名とは異なる名前を指定できます。これは、長いファイル名を短くしたり、自分で見つけやすくするためにラベルを付けたりするのに役立ちます。一般的な構文は以下のとおりです。
curl -o [shortname] [url]
たとえば、Apple サーバーにリストされている iOS IPSW ファイルを長いフルネームなしで保存する場合は、次のようにします。
curl -o iPhone5C-704.ipsw http://appldnld.apple.com/iOS7/031-1828.20131114.P3wE4/iPhone5,3_7.0.4_11B554a_Restore.ipsw
これにより、「iPhone5,3_7.0.4_11B554a_Restore.ipsw」ファイルがダウンロードされますが、より意味のある「iPhone5C-704.ipsw」という短い名前が付けられます。
現在の作業ディレクトリにファイルを保存したくない場合は、次のようにファイル名の一部としてパスを指定します。
curl -o ~/Desktop/localexample.dmg http://url-to-file/example.dmg
curl で複数のファイルを同時にダウンロードする
cURL を使用すると、複数のファイルを同時に簡単にダウンロードできます。必要なのは、次のように複数の URL を指定することだけです。
curl -O [URL 1] [URL 2] [URL 3]
名前が異なるファイル、異なるサーバーでホストされているファイル、または異なるディレクトリ パス内にあるファイルの場合は、完全な URL を使用します。例:
curl -O http://ftp.gnu.org/gnu/Licenses/fdl-1.1.txt http://ftp.gnu.org/gnu/Licenses/lgpl-2.1.txt http://ftp.gnu.org/gnu/GNUinfo/Audio/index.txt
一方、ダウンロードするファイル名に増分命名が使用されている場合は、次のように括弧を使用してダウンロード範囲を指定できます。
curl -O http://ftp.gnu.org/gnu/Licenses/fd1-1[1-3].txt
これにより、fdl-1.1.txt、fd1-1.2.txt、fd1-1.3.txt の各ファイルを、それぞれ固有の URL を指定することなく同時に取得できます。もちろん、この方法はファイルが同じディレクトリにあり、同じドメインにある場合にのみ機能します。
curl による認証
-u フラグを使用して cURL で認証を渡すこともできます。
curl -u user:pass -O ftp://remote_url/file-to-download.zip
-u オプションでユーザー名とパスワードを指定すると、bash の履歴にパスワードがプレーンテキストで保存されることに注意してください。そのため、ほとんどの状況では推奨されません。「curl」の前にスペースを入れることで、この問題を回避できます。スペースキーをコマンドの先頭に付けない場合は、安全のために後でコマンド履歴を空にすることをお勧めします。
HTTPとFTP以外でサポートされているcurlプロトコルと使用法
前述のように、cURL の使用法は HTTP や FTP をはるかに超えており、curl のマニュアル ページのエントリでは説明に次のような追加のプロトコルが記載されています。
curl は、
サポートされているプロトコル (DICT、FILE、FTP、FTPS、GOPHER、HTTP、HTTPS、IMAP、
IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、
TELNET、TFTP) のいずれかを使用して、サーバーとの間でデータを転送するためのツールです。
さらに、curl は、専用の Web ブラウザを使用せずに、PUT リクエストと POST リクエスト、Cookie、プロキシ、トンネル、ダウンロードの再開、さらには HTTP ヘッダー情報の取得やユーザー エージェントの変更 (事実上スプーフィング) にも使用できることがわかります。
ほとんどのコマンドライン ユーティリティと同様に、「man curl」コマンドを使用して適切なマニュアル ページを呼び出すと、curl についてさらに詳しく知ることができます。