Hatena::ブログ(Diary)

spikelet days

ソフトウェア開発(主に低レイヤ)における Spike の記録。

2008-04-01

[][] 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で表示)に書いてある:

プロキシユーザ名とパスワードは、認証情報つきの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 をダイレクトに指定する場合(非再帰的な時)は、以下の処理:

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/taiyo/20080401/p2