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")
- 環境変数としても設定可能(ただし設定ファイルの方が優先される)("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 を参照した。
概要
- 設定可能なリストはsrc/init.c の commands に格納されている
- commands のうち一部はコマンドラインオプションで指定可能 (src/main.c の option_data にて指定)
- 設定の優先順位は、コマンドラインオプション > 設定ファイル > 環境変数
- 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の該当要素を検索
- parse_line() : ファイルの一行分を処理
- run_wgetrc() : ファイルのopen〜各行処理〜クローズまで
- initialize()
これで、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()の限界(オプション文字が一杯だから)か?
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 |