wgetを認証必須のプロキシ経由で使いたい

目的

id:taiyo:20080401#p1 を参照。

結果

セキュリティ面(秘匿性)を考慮すると、~/.wgetrc に、以下の設定を記述するのが良い:

use_proxy = on
proxy_user = 4000000
proxy_passwd = PassWord
http_proxy = http://abcproxy.examlple.com:8080
https_proxy = http://abcproxy.examlple.com:8080
ftp_proxy = http://abcproxy.examlple.com:8080

もちろん、~/.wgetrc のパーミッションは 600(自分のみread/wriet可) にしておくこと。

wgetの仕様

wgetのinfo(info wgetで表示)に書いてある:

  • コマンドラインオプションとして、以下が指定可能 ("2.7 HTTP Options")
    • --proxy-user=USER
    • --proxy-password=PASSWORD
  • 設定ファイル(~/.wgetrc)として、以下を記述可能 ("6.3 Wgetrc Commands")
    • ftp_proxy = STRING
    • ftp_user = STRING
    • http_proxy = STRING
    • proxy_user = STRING
    • proxy_password = STRING
    • use_proxy = on/off (これは書いてなくても良いみたい)
  • 環境変数としても設定可能(ただし設定ファイルの方が優先される)("8.1 Proxies")
    • http_proxy
    • ftp_proxy

プロキシのユーザ名とパスワードは、認証情報つきのURLの形式で書いても良い(ユーザ名とパスワードが記号などを含む場合は、URLエンコードした文字列にすること)。
例: http_proxy = http://MY_ID:MY_URLENCODE_PASSWORD@MYPROXY.EXAMPLE.COM:PORT-NUMBER/
(参考:Uniform Resource Locator - Wikipedia
ただしコマンドラインオプションの方が優先される。

ソースを見てみる

wget-1.11.1 を参照した。

概要
  1. 設定可能なリストはsrc/init.c の commands に格納されている
  2. commands のうち一部はコマンドラインオプションで指定可能 (src/main.c の option_data にて指定)
  3. 設定の優先順位は、コマンドラインオプション > 設定ファイル > 環境変数
  4. wget が処理可能なSCHEMEは http, https, proxy (proxyのURLも同じく)

httpsについては、infoに書かれていなかった

設定ファイルの処理

src/init.c の static 変数 commands に、処理する変数一覧が格納されている。

static const struct {
  const char *name;
  void *place;
  bool (*action) (const char *, const char *, void *);
} commands[] = {
...
  { "httppasswd",       &opt.http_passwd,       cmd_string }, /* deprecated */
  { "httppassword",     &opt.http_passwd,       cmd_string },
  { "httpproxy",        &opt.http_proxy,        cmd_string },
  { "httpsproxy",       &opt.https_proxy,       cmd_string },
  { "httpuser",         &opt.http_user,         cmd_string },

処理フローは以下のよう:

  • main()
    • initialize()
      • run_wgetrc() : ファイルのopen〜各行処理〜クローズまで
        • parse_line() : ファイルの一行分を処理
          • command_by_name() : 文字列からcommandsの該当要素を検索

これで、commandsで定義されている各コマンドの設定値が、global 変数 struct options opt に入れられる。

コマンドラインオプションの処理

src/main.c の static 変数 option_data に、処理オプション一覧が格納されている。

static struct cmdline_option option_data[] =
  {
...
    { "http-passwd", 0, OPT_VALUE, "httppassword", -1 }, /* deprecated */
    { "http-password", 0, OPT_VALUE, "httppassword", -1 },
    { "http-user", 0, OPT_VALUE, "httpuser", -1 },

処理フローは以下の感じ:

  • main()
    • initialize() : ←ここで設定ファイル処理がされ、その後にオプション設定が上書きされる
    • init_switches() : option_data から getopt_long() の引数への変換処理
    • setoptval() : getopt_long()の解析結果からオプション文字列を再度作成
      • command_by_name() : 文字列からcommandsの該当要素を検索
      • setval_internal() :

commandsの全部が指定可能なわけではない。これは、getopt_long()の限界(オプション文字が一杯だから)か?

設定値の使われ方

src/retr.c の中に、コンテンツ取得処理が入っている。
たとえば URL をダイレクトに指定する場合(非再帰的な時)は、以下の処理:

  • main()
    • retrieve_url()
      • getproxy() : プロキシの取得(opt に設定が無ければ環境変数から)
        • url_parse(proxy) : proxyのURLを解析(scheme, user, pass, host, port, path, ...)
        • SCHEMEがHTTPかHTTPSの時: http_loop()
        • SCHEMEFTPの時: ftp_loop()

getproxy()内部では、対象URLのSCHEMEに合わせた opt のメンバーか環境変数を使う。

wgetの仕様のまとめ

左側にある設定が優先される。

コマンドラインオプション 設定ファイル ~/.wgetrc 環境変数
プロキシのユーザ名 --proxy-user=USER proxy_user=USER or URLに埋め込み (URLに埋め込む)
プロキシのパスワード --proxy-password=PASSWORD proxy_password=PASSWORD or URLに埋め込み (URLに埋め込む)
HTTP用プロキシ なし http_proxy = PROXY http_proxy
HTTPS用プロキシ なし https_proxy = PROXY https_proxy
FTP用プロキシ なし ftp_proxy = PROXY ftp_proxy