GNU Wget

(あるいは単に )はウェブサーバからコンテンツを取得するダウンローダであり、GNUプロジェクトの一部である。その名称はワールド・ワイド・ウェブ(WWW)とプログラムの主要な機能であるデータ取得を意味する英語の「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は自由ソフトウェアである。

特徴

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

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

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

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

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

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

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

Wgetの使い方

基本的な使い方
URLを(1個以上)引数にして をコマンドラインから呼ぶのが、典型的な使い方である。(下表ではコマンドは読み易すくするために複数行で記述してあるが、実際には改行のない一行である。)

コマンド機能wget
 http://www.example.com/「www.example.com」のタイトルページをダウンロードし「index.html」という名前のファイルに保存する。wget
 ftp://ftp.gnu.org/pub/gnu/wget/wget-latest.tar.gzGNUのftpサイトからWgetのソースコードをダウンロードする。

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

コマンド機能wget
 --execute robots=off
 --recursive
 --level=1
 --no-parent
 ---accept .gif
 http://www.server.com/dir/ウェブサイトから拡張子が「.gif」であるすべてのファイルをダウンロードする。(wget 'http://www.server.com/dir/*.gif')のようなワイルドカードの展開はFTPにおいてのみ可能)wget
 --page-requisites
 --convert-links
 http://www.example.com/「www.example.com」のタイトルページを、ページを表示するのに必要な画像とスタイルシートとともにダウンロードし、その中にあるURLがローカルで利用可能なコンテンツを参照するように変換する。wget
 --recursive
 --level=0
 http://www.example.com/「www.example.com」の全てのコンテンツをダウンロードする

進んだ使い方
コマンド機能<nowiki>wget
 --tries=7
 --wait=5
 --waitretry=14
 --random-wait
 --mirror
 --convert-links
 --backup-converted
 --execute robots=off
 --output-file=./session.log
 http://www.oreilly.com/catalog/upt3/errata/
</nowiki>購入したばかりの本の正誤表をダウンロードする。全てのローカルのリンクを再帰的にダウンロードしファイルをオフラインでの閲覧に適したものにする。ファイル取得の間に5×0.5秒から5×1.5秒のランダムな待ち時間を設ける。ファイル取得に失敗したときには7回まで取得を試みる。その際には14秒ずつ間を空ける。アクセス結果をローカルのファイル「./session.log」に記録する。<nowiki>wget
 --tries=22
 --waitretry=48
 --wait=30
 --random-wait
 --execute robots=off
 --output-file=./my_movies.log
 --directory-prefix=/movies
 --input-file=./my_movies.txt</nowiki>ローカルのファイル「my_movies.txt」に一行ごとに記述されたリンクのみを取得する。ファイル取得の間に15秒から45秒のランダムな間隔をあける。ファイル取得に失敗した場合には48秒の間隔をあけて22回まで再試行する。HTTPリクエストヘッダーにはuser-agentを含めない。ロボット排除は無視する。取得した全てのファイルをディレクトリ「/movies」に保存し、全てのアクセス結果をファイル「my_movies.log」に保存する。名前のわかった特定の画像もしくはその他のファイルだけをダウンロードする場合に適する。<nowiki>wget
 --cookies=on
 --keep-session-cookies
 --save-cookies=cookie.txt
 http://first_page</nowiki> をレファラーとクッキーで保護されたコンテンツをダウンロードするのに用いる。ベースとなるURLを取得しそのクッキーをファイルに保存する。<nowiki>wget
 --referer=http://first_page
 --cookies=on
 --load-cookies=cookie.txt
 --keep-session-cookies
 --save-cookies=cookie.txt
 http://second_page</nowiki> をレファラーとクッキーで保護されたコンテンツをダウンロードするのに用いる。保存されたクッキーを利用して保護されたコンテンツを取得する。<nowiki>wget
 --mirror
 --wait=2
 --page-requisites
 --html-extension
 --convert-links
 --directory-prefix=DIRECTORY
 http://www.yourdomain.com</nowiki>ウェブサイトをミラーしローカルでの閲覧のための静的なコピーを作る。つまり、全てのリンクはローカルのファイルを示すように変換される。注: --html-extension はCGI、ASPあるいはPHPにより生成されたファイルをHTMLに変換する。

 主要なコマンドラインオプション 
オプション機能 -r
 --recursiveダウンロードを再帰的にする。 -A LIST
 --accept=LISTダウンロードするファイル名を LIST で指定する。 -D LIST
 --domain=LISTドメイン名を LIST で指定する。 -O FILE出力先のファイル名指定する。ファイル名として「-」を指定すると出力先は標準出力になる。 -V
 --versionバージョン情報を表示する。 -h
 --helpヘルプを表示する。 -b
 --backgroundバックグラウンド モードにする。 --header=STRINGHTTPヘッダ STRING を指定する。 -e COMMAND
 --execute COMMANDコマンド COMMAND を実行する。(ファイル .wgetrc と同じ形式)

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

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

歴史

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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ヘッダーの使用
 TCPファストオープン