GNU Wget

enはウェブサーバからコンテンツを取得するダウンローダであり、GNUプロジェクトの一部である。その名称はワールド・ワイド・ウェブとプログラムの主要な機能であるデータ取得を意味する英語の「get」から派生したものである。現在Wgetはウェブ閲覧のために用いられるTCP/IPに基づいたもっともポピュラーなプロトコルである、HTTP、HTTPS及びFTP によるダウンロードが利用可能である。

Wgetの特徴としては、再帰的ダウンロード、ローカルに取得したHTMLをオフラインで閲覧するためのリンクの変換、プロキシのサポートその他数多くの機能を挙げることができる。Wgetは1996年に、ウェブの人気の急拡大と軌を一にして登場した。その結果多くのUNIXユーザーに用いられるようになり、ほとんどの主要なLinuxディストリビューションとともに配布されるようになった。移植性の高いC言語によって書かれているため、WgetはいずれのUnix系システムにも容易にインストールできる。またmacOS、Windows、OpenVMS及びAmigaOSを含む多くの環境に移植されている。

WgetはGNOMEデスクトップにおけるGWgetやKDEデスクトップにおけるKGetのようなGUIプログラムの基礎として用いられている。Wgetはフリーソフトウェアである。

1. 特徴
-----

1.1. 確実性
--------

Wgetは低速あるいは不安定なネットワーク接続でも確実に動作するように設計されている。もしダウンロードがネットワークの問題によって完了しなかった場合、Wgetは自動的にダウンロードが停止した箇所からダウンロードを継続するように試み、ファイル全体が取得されるまでこれを繰り返す。Wgetは、この機能を利用するため、当時としては新しかったRangeHTTPヘッダをもっとも早期に採用したクライアントの一つとなった。

1.2. 再帰的ダウンロード
--------------

Wgetをクローラとして動作させることも可能である。クローラとして動作するとき、Wgetは、リソースのハイパーリンクをHTMLのウェブページから抽出し、それらを連続してダウンロードし、ユーザーによって指定された最大繰り返しの回数に達するまで再帰的に繰り返す。ダウンロードされたページは、リモートのサーバのディレクトリ構成に類似したディレクトリ構成に保存される。この「再帰的ダウンロード」はHTTPによるウェブサイトの部分的もしくは完全なミラーリングを可能にする。Wgetは、ダウンロードされたHTMLページ内のリンクを、オフラインでの閲覧のため、ローカルにダウンロードされた素材に向けられるよう調整することもできる。この種のウェブサイトの自動的ミラーリングを行うときには、WgetはRobots Exclusion Standardを遵守する。

再帰的ダウンロードはFTPでも同様に動作する。その際、Wgetはダウンロード対象となるファイルを発見するためにLISTコマンドを発行する。そしてトップのURLで指定されたものより下位のファイルとディレクトリに関してこのプロセスを繰り返す。FTPのURLのダウンロードが要求された場合には、シェル類似のワイルドカードが利用できる。

HTTPを用いる場合でもFTPを用いる場合でも、再帰的ダウンロードを行う際には、Wgetにローカル及びリモートのファイルのタイムスタンプを調べ、リモートファイルが相当するローカルファイルより新しい場合にのみダウンロードを行うように命令することができる。これによりHTTP及びFTPサイトの容易なミラーリングが可能になるが、これはrsyncのように、最初からミラーリングを行うために設計されたプログラムに比べ非効率でよりエラーを生じやすいと考えられている。一方で、Wgetはこの作業のために特別なサーバ側のソフトウェアを必要としないという利点もある。

1.3. 非対話性
---------

Wgetは非対話的なプログラムである。つまり、一度起動すれば、Wgetはユーザーとの対話を必要とせずTTYをコントロールする必要もなく、進捗状況は別のファイルに記録しておくこともできるということである。そういった非対話的な形でユーザーはWgetを起動し、プログラムを監視することもせずログアウトすることができる。対照的に、ほとんどのグラフィカルユーザインタフェースあるいはテキストユーザインタフェースのウェブブラウザは、ユーザーがログインし続けることと、失敗したダウンロードを手動で再度スタートすることを求める。これは大量のデータを転送する際には大きな障害となりうる。

1.4. 移植性
--------

Wgetは、サードパーティーのライブラリに対する依存性を最小限にした、C言語の移植性の高いスタイルで記述されている。Wgetには、C言語コンパイラとTCP/IPネットワーキングに対するBSDライクなインタフェースの他にはほとんど必要なものはない。WgetはUnixシェルから呼び出されるUNIXプログラムとして設計されたため、多くのUnix系環境やシステムに移植されている。それはWindows及びmacOSなどを含んでいる。

1.5. その他の特徴
-----------

Wgetはプロキシ経由でダウンロードを行える。プロキシは会社のファイアウォール内部からのウェブアクセスを可能にするためや頻繁にアクセスされるコンテンツをキャッシュし速く提供するために広く用いられている。
Wgetは持続的HTTP接続が利用可能な場合にはそれを利用する。
適切なインタフェースが含まれているシステムにおいてはIPv6が利用できる。
OpenSSLライブラリを利用し、暗号化されたダウンロードを行うためにSSL/TLSが利用できる。
適切なインタフェースが含まれている32ビットシステムでは2GiBより大きいファイルもサポートされている。
利用可能な帯域幅すべてを使い尽くすことを避けるため、ダウンロードの速度を調整することができる。

2. Wgetの使い方
-----------

2.1. 基本的な使い方
------------

URLを引数にして en をコマンドラインから呼ぶのが、典型的な使い方である。

より複雑な使い方として、複数のURLを階層を保ったままディレクトリに自動的にダウンロードする、というのもある。



2.2. 進んだ使い方
-----------



2.3. 主要なコマンドラインオプション
--------------------



3. 著者と著作権
---------

GNU WgetはHrvoje Nikšićによって書かれた。彼のほかDan Harkless、Ian Abbott、Mauro Tortonesiなど多くの人々がWgetに寄稿している。主要な寄稿者達は配布物に含まれる//AUTHORS//ファイルにクレジットされている。その他多くの人々は配布物に含まれるchangelogに記載されている。現在、WgetはGiuseppe Scrivanoによってメンテナンスされている。

Wgetの著作権はフリーソフトウェア財団に所属する。GNUソフトウェアに対する重要な寄稿全てに対して著作権譲渡を要求するというのがフリーソフトウェア財団のポリシーである。[1]

4. 歴史
-----

4.1. 初期
-------

Wgetは同じ作者による以前のプログラムGeturlの後継である。Geturlの開発は1995年後半に始まった。ところが作者は、以前ジェイムズ・バートンがAmiga用にAREXXで書いたGetURLというプログラムがあることに気づいた。その後、名称は//Wget//に改められた。

Wgetは1990年代半ばに利用可能であったウェブダウンロードソフトウェアの間隙を埋めるものだった。HTTPとFTPの両方のプロトコルで確実にファイルをダウンロードできるプログラムは一つもなかった。当時存在したプログラムはFTPのみ利用可能だったかPerlで書かれたものだった。Wgetは当時すでにあったプログラムの機能に刺激を受けてはいたものの、このプロジェクトの目標はHTTPとFTPの両方を利用可能にすることと、ユーザーがどのUnixシステムにもある標準的な開発ツールのみを用いてWgetをビルドできるようにすることだった。

当時多くのUnixユーザーは、極端に遅い大学とダイヤルアップ接続のインターネット接続に苦しんでいた。このため、操作する人間が補助しなくとも一過性のネットワーク障害に対処できるダウンロードエージェントに対するニーズが増大していた。

4.2. 主なリリース
-----------

以下に挙げるリリースはWgetの開発において重要な節目となるものである。それぞれのリリースに隣接して掲載している機能は簡潔さを旨として編集されており、当該リリースに関する網羅的情報ではない。そのような情報はWgetとともに配布されている//NEWS//ファイルに掲載されている。[2].

Geturl 1.0  最初の一般公開である。英語での最初の告知は [3]までたどることができる。これは恐らくは6月にリリースされたGeturl 1.3.4に関するものである。
Wget 1.4.0 //Wget//の名を冠した最初のリリースである。これは同時にGPLの下で配布された最初のリリースでもある。Geturlはアドホックな無保証のライセンスの下で配布されていた。
Wget 1.4.3 著作権をフリーソフトウェア財団に譲渡してGNU projectの一部としてリリースされた最初の版である。
Wget 1.5.3 このプログラムの人気において節目となった。この版は多くのLinuxディストリビューションに同梱され、より多くの人々の目に触れるようになった。
Wget 1.6 当時新鮮でなくなっていたリリース1.5.3に多くのバグフィックスを加えた。Dan Harklessの尽力に多くを負っている。
Wget 1.7 SSLサポート、クッキー及び持続的接続を導入した。
Wget 1.8 帯域幅調整、新しい進行状況表示及びハイパーリンクグラフの幅優先探索を追加した。
Wget 1.9 実験的なIPv6のサポート及びHTTPサーバへのデータPOST機能を導入。
Wget 1.10 2GiBを超えるファイルのサポート、dual-familyシステムでのIPv6サポート、NTLM認証、及び SSL関連の改良が行われた。Mauro Tortonesiがメンテナを引き継いだ。
Wget 1.11 GPLバージョン3へ移行した。CGIスクリプトでダウンロードするファイルの名称を示すためにしばしば用いられるContent-Dispositionヘッダへの予備的なサポートを追加した。HTTP認証に関するコードにセキュリティ関連の改良が加えられた。Micah Cowanがプロジェクトのメンテナを引き継いだ。
Wget 1.12 ウェブ上のCSSからのURL解析機能と国際化資源識別子の取り扱いが追加された。
Wget 1.13 HTTP/1.1がサポートされた。またいくつかの移植性に関する問題が修正された。セキュアな接続のためのライブラリとしてOpenSSLに代え、デフォルトでGnuTLSを利用するように変更された。
Wget 1.14 WARCファイルのサポートを追加。RFC2617ダイジェストアクセス認証のサポートを追加。GNU TLSバックエンドでのメモリリークの問題を修正。GNU TLSを使用する場合にクライアント証明書を有効に。
Wget 1.15 --https-onlyと--methodオプションを追加。入力ファイル内で短縮URLに対応。MD5-SESSをサポート。
Wget 1.16  デフォルトでローカルのシンボリックリンクを作成しなくなった。デフォルトのプログレスバーの出力を変更。--no-configと--start-POSオプションを追加。
Wget 1.17  FTPのパッシブモードを削除し、FTPSがサポートされた。--if-modified-sinceオプションを追加。
Wget 1.18  脆弱性「CVE-2016-4971」を修正。--bind-dns-addressと--dns-serversオプションを追加。
Wget 1.19  Metalinkファイルに対応、それに伴い新規オプションを追加。1.19.1にて、指定したHTTPステータスコードが返されるとダウンロードをリトライする--retry-on-http-errorオプションを追加。
Wget 1.20  信頼性向上のための--retry-on-host-errorオプション、FTPの再帰的なリモートファイルダウンロードをサポートする--accept-regex、--reject-regexオプションを追加。
Wget 1.21  翻訳文字列増加。alloca の全削除。構成フラグ --enable-fsanitize-ubsanと--enable-fsanitize-asanと--enable-fsanitize-msan for gcc and clang追加。OpenSSL のハンドシェイク後認証追加。gettext バージョン 0.19.3+ が必須に。一部のロケールで進行中のバーコードのバッファーオーバーフロー他、バグ修正。

5. 開発とリリースのサイクル
---------------

Wgetの開発はオープンな流儀で行われている。ほとんどの設計上の決定は、通常はユーザーと開発者が参加する公開のメーリングリスト[4]で行われている。バグリポートとパッチも同じメーリングリストに流される。

5.1. ソースの投稿
-----------

Wgetのコードやドキュメンテーションを投稿する際に好まれる方法はdiffユーティリティによって生成されるテキストのパッチの形でソースを更新することである。パッチをWgetに含めようとする場合は、メーリングリスト[5]に投稿されメンテナによってレビューされる。メンテナの検査を通過したパッチはソースに加えられる。パッチの作り方とスタイルのガイドラインはプロジェクトのwiki[6]に概略が示されている。

ソースコードは、リリース1.5.3に始まる改訂の歴史を保存するリモートバージョンコントロールリポジトリで追跡することができる。リポジトリはMercurialで管理されている。以前はSubversion、さらにその前はCVSで管理されていた。

5.2. リリース
---------

開発中に十分な数の機能あるいはバグフィックスが集積したときに、WgetはGNUのFTPサイト及びそのミラーサイトを通じて一般に公開される。プロジェクトは完全にボランティアによって運営されているので、リリースを発表することについて外部からの圧力はなく、強制力のあるリリースの締め切りもない。

リリースには//メジャー.マイナー.リビジョン//という形式でバージョンナンバーが振られている。//Wget 1.11//、//Wget 1.8.2//。メジャーバージョンナンバーが増加されるのは、大きなそして場合によっては非互換となるようなWgetの動作の変更あるいはコードベースの根本的な再設計がある場合である。マイナーバージョンナンバーが増加されるのは新しい機能の追加とバグフィックスを示す場合である。新しいリビジョンは、その前のリビジョンに比較して、バグフィックスのみが含まれていることを示している。リビジョン ゼロは省略される。つまりWget 1.11は1.11.0と同じことである。

6. ライセンス
--------

GNU WgetはGNU General Public Licenseバージョン3以降のもとで、OpenSSLライブラリにリンクされたバイナリの配布を許可するという特別な例外をつけて配布されている。例外規定は以下の通りである:

enWgetがGnuTLSライブラリにリンクできるように改良された際にはこの例外規定が削除されることが期待されている。

Wgetの ドキュメンテーションは Texinfoリファレンスマニュアルの形態で、GNU Free Documentation Licenseバージョン1.2以降の条件で配布されている。通常Unixライクなシステムで配布されているman pageはTexinfoマニュアルのサブセットから自動的に生成され、同じライセンスが適用される。

7. 国際化
------

WgetはGNU gettextによる国際化に対応している。Unixライクなシステムでは環境変数を適切に設定することで母語を表示させることができる。Wget-1.12では日本語を含め30以上の言語に対応している。

8. Wget2
--------

GNU Wget2のバージョン2.0.0は、2021年9月26日にリリースされた。Wget2はGNU General Public Licenseバージョン3以降のもとで配布されており、これをラッピングするLibwgetはGNU Lesser General Public Licenseバージョン3以降のもとで配布されている。Wget2はWgetと比較して多くの改善点があり、特に、以下のプロトコルと技術に対応したことで、多くの場合、Wget2はWget1.xより遥かに高速にダウンロードすることができる。

HTTP/2
並列接続
HTTPヘッダーフィールドの一覧HTTPヘッダーの使用
TCPファストオープン

9. 脚注
-----

10. 関連項目
--------

クローラ
The GNU Project
cURL
lftp

11. 外部リンク
---------