Linuxのターミナルからファイルをダウンロードする方法は、curlとwgetだけではありません。他にも柔軟性と機能を備えたツールやコマンドがあり、より効率的にファイルをダウンロードできます。特定の制限があるために別の方法を探している場合でも、より高度な制御が可能な新しいコマンドを試してみたい場合でも、これらのツールを調べることで、ターミナルでの作業に関する知識を広げ、生産性を向上させることができます。

シンプルなHTTPリクエストを送信できないシステムトラブルに遭遇したことはありませんか?システムの復旧やDockerイメージの作成を試みていたのかもしれません。利用可能なツールを使う必要がある場合もあれば、単に興味があるだけの場合もあります。HTTP経由で接続し、ファイルをダウンロードする5つの方法をご紹介します。
まず、必要な HTTP ヘッダーを理解します。
HTTP接続を確立するには、多くの場合HTTPヘッダーを送信する必要があります。以下で説明するコマンドの一部では、HTTPヘッダーを手動で作成する必要がありますが、それほど複雑ではありません。
HTTPヘッダーは、HTTP接続を初期化する小さなテキストブロックです。以下のほとんどの例では、HTTPヘッダーは次のようになります。
GET / HTTP/1.1\r\n
HOST: example.com\r\n
\r\n
最初の行はリクエスト行と呼ばれ、クライアントに特定のパスから何かを取得するよう指示します。パスとは、URL内の.comや.netなどの後に続く部分すべてを指します(例:example.com/path/foo)。
- ホスト行は、接続先のホストの名前を指定します。
- 各行はキャリッジリターン(\r)と改行(\n)で終わります。アドレス全体は空行で終わります。
上記のURLは、example.com(パス "/")からメインドキュメントを取得します。HTTP URLについて理解できたので、以下のコマンドで使用できます。
Telnet ですが、従来の HTTP 接続でのみ機能します。
次のコマンドは奇妙に思えるかもしれませんが、実際にはTelnetはHTTPクライアントではないため、カスタムHTTPヘッダーを作成しています。括弧はサブシェルを表し、セミコロンで区切られた各コマンドが1つずつ実行され、Telnetに送信されます。
(echo "GET / HTTP/1.0"; echo "Host: example.com"; echo; sleep 1) | telnet example.com 80
たとえば、ターミナルで次のコマンドを実行すると、grep が各行を個別に受信することがわかります。
(echo foobar; sleep 1; echo foobaz) | grep foo
Telnetの場合、これはHTTPヘッダーの各行をデータストリームとして個別に受信することを意味します。このコマンドは接続を終了するために空行(エコー)を送信し、その後1秒間待機してサーバーが応答するのに十分な時間を確保します。この待機時間は、応答時間を推測するだけなので、脆弱であると考えられます。接続が早く切断される場合は、この値を調整する必要があるかもしれません。
通知
Telnet は TLS を使用できないため、通常の HTTP 接続でのみ機能します。
助言
HTTP/1.0 はサーバーからの応答があると自動的に接続を閉じますが、HTTP/1.1 は接続を閉じません。そのため、Telnet は HTTP 経由で大きなファイルをダウンロードする際に信頼性が低く、接続を開いたままにする必要がないため、HTTP/1.0 を使用します。
次のコマンドを使用して、Fedora に Telnet をインストールできます。
sudo dnf install telnet -y
Debian およびその他のシステムの場合は、次のコマンドを入力します。
sudo apt install telnet -y
Archユーザーの皆さん、残念ながらTelnetは公式リポジトリでは利用できません。ただし、PuTTYは利用可能なので、代わりに使用できます。
sudo pacman -S putty
Netcat は Telnet よりわずかに優れています。

HTTP接続を確立する場合、NetcatコマンドはTelnetコマンドとほぼ同じように動作しますが、HTTPヘッダーを単一のテキストブロックとして提供する点が異なります。上記および下記の例からわかるように、HTTPヘッダーの各行は制御文字「\r\n」で終わります。これは最終行の文字を2つ重ねたもので、ヘッダーの終了を示します。
次の例 (Netcat または Ncat) はどちらも大きなファイルのダウンロードには適していませんが、小さなファイルのダウンロードは簡単にできます。
プレーンHTTP
Netcat は TLS (HTTPS) をサポートしていませんが、プレーン HTTP を取得するために使用できます。
printf "GET / HTTP/1.0\r\nHost: example.com\r\n\r\n" | nc example.com 80
次のコマンドを使用して、Fedora に Netcat をインストールできます。
sudo dnf install netcat -y
Debian およびその他のシステムの場合は、次のコマンドを入力します。
sudo apt install netcat-openbsd -y
Arch ユーザーの場合、Netcat は追加のリポジトリで利用できます。
sudo pacman -S openbsd-netcat
TLSの場合
TLS接続で接続したい場合は、Nmapプロジェクトの一部であるNetcatの改良版であるNcatを使用する必要があります。Ncatは従来のHTTP接続も確立できます。
printf "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n" | ncat --ssl example.com 443
次のコマンドを使用して、Fedora に Ncat をインストールできます。
sudo dnf install nmap-ncat -y
Debian およびその他のシステムの場合は、次のコマンドを入力します。
sudo apt install ncat -y
Arch ユーザーの場合、Ncat は Nmap パッケージの一部なので、次のコマンドを入力する必要があります。
sudo pacman -S nmap
絶望したときは、Python の Requests ライブラリを使用してください。
次のコマンドはプレーンテキストまたは HTML ファイルでは適切に機能しますが、バイナリ データ (画像、zip ファイルなど) は適切に処理されません。
python3 -c "import requests; print(requests.get('http://example.com').text)"
画像や zip ファイルなどのバイナリ データを適切にダウンロードするには、次のコマンドを使用します。
python3 -c "import requests; open('output_file.zip','wb').write(requests.get('http://example.com/file.zip').content)"
「output_file.zip」ファイルとURLを変更します。
多くのシステムにはPython 3(およびpip)がプリインストールされていますが、requestsライブラリは別途インストールする必要があります。pipまたはディストリビューションのパッケージマネージャーを使ってインストールできます。
管理者権限がない場合は、pipを使ってユーザーのホームフォルダにインストールできます。以下のコマンドを入力してください。
pip install --user requests
次のコマンドを使用して、Fedora パッケージ マネージャー経由でアプリケーションをインストールできます。
sudo dnf install python3-requests -y
Debian およびその他のシステムの場合は、次のコマンドを入力します。
sudo apt install python3-requests -y
Arch の場合は、次のコマンドを入力します。
sudo pacman -S python-requests
HTTPie: 便利なツール
HTTPieはREST API(ウェブページサービス)のテストツールであると自称しています。以下のコマンドは、example.comにあるHTMLドキュメントを取得するためのシンプルなリクエストを発行します。
http GET example.com
HTTPie は、URL の記述を容易にする便利な機能をいくつかサポートしています。例えば、次のコマンドは、システム上のローカルサーバー(ポート 3000)に接続します。
http :3000
URL にパラメータを追加するのは、二重等号を使用するのと同じくらい簡単です。
http httpbin.org/anything foo==bar
これにより、http://httpbin.org/anything?foo=bar のような URL が作成されます。

HTTPS 接続を行うには、次のコマンドを使用します。
https GET example.com
HTTPie は主に開発者を支援することを目的としていますが、通常の HTTP クライアントとしても機能するため、ファイルのダウンロードに最適です。

次のコマンドを使用して、Fedora に HTTPie をインストールできます。
sudo dnf install httpie -y
Debian およびその他のシステムの場合は、次のコマンドを入力します。
sudo apt install httpie -y
Arch の場合は、次のコマンドを入力します。
sudo pacman -S httpie
Aria2: ファイルを端末にダウンロードするための強力なツール。
HTTP、HTTPS、FTP、SFTP、BitTorrent、WebSocketなど、複数のプロトコルをサポートしています。また、複数の並列接続を作成することでダウンロードを高速化します。ファイルをダウンロードするには、「-d」フラグでフォルダを指定し、「-o」フラグでダウンロード後のファイル名を指定するだけです。
aria2c -d /tmp -o test.html http://example.com
Aria2 は HTTP および HTTPS とシームレスに連携し、HTML ドキュメントとファイルをダウンロードします。
次のコマンドを使用して、Fedora に Aria2 をインストールできます。
sudo dnf install aria2 -y
Debian およびその他のシステムの場合は、次のコマンドを入力します。
sudo apt install aria2 -y
Arch の場合は、次のコマンドを入力します。
sudo pacman -S aria2
HTTP処理能力が低いため、TelnetコマンドとNetcatコマンドは数キロバイト以下のファイルでしか動作しません。それより大きなファイルをダウンロードするには、適切なHTTPクライアントを使用する必要があります。Pythonコマンド、HTTPie、aria2はすべて、本物のHTTPクライアントとして動作します。本物のHTTPクライアントを使用しているかどうかを判断するには、HTTPヘッダーを手動で挿入する必要があるかどうかを自問してみてください。必要な場合は、本物のHTTPクライアントを使用していない可能性があります。
実際には、TelnetとNetcatは主に緊急ツールとして使用されます。専用のツールを使わずに接続をテストする必要がある場合に便利です。少なくとも、HTTP通信の低レベル化への興味深い入門を提供してくれます。
Telnetについて詳しく知りたい方は、TelnetとSSHの違いに関する記事をご覧ください。また、Netcatの様々なユースケースを詳しく説明した記事もございます。最後に、非常に便利なツールであるHTTPieの使い方に関する詳細なガイドもご用意しております。
Linuxターミナルを使用すると、一般的なツール以外にも、ファイルのダウンロードに複数の選択肢があります。ダウンロードの再開や異なるプロトコルの管理といった高度な機能を備えたコマンドもあれば、シンプルさとスピードを重視したコマンドもあります。適切なツールの選択はニーズによって異なります。複数の方法を試すことで、ファイルを効率的に処理するための柔軟性が向上します。






