cUrlコマンドとプロキシと認証

仕事場のPCで同様にrepoをインストール、と思ったんだが仕事場のネットワークには恐怖のNTLMプロトコルを使うMS-Proxy Server様が鎮座在しているため、そのままではまず駄目だろうと思いつつやってみたら..

$ curl http://android.git.kernel.org/repo > repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:01:23 --:--:--     0
curl: (7) couldn't connect to host

案の定駄目だった。
仕方が無いので以前覚えた.bashrcにプロキシの記述を行って実行したところ問題なくインストールされたのだが、

    • .bashrcのプロキシ設定
proxy=http://プロキシサーバのURL:ポート番号/ 
export http_proxy=$proxy 
export HTTP_PROXY=$proxy 

はてさて、プロキシの認証情報が全く記述されていないのに、どうしてこれで上手く動くのだろう。

Helpを見るとどうやらcUrlのwin32版はNTLM認証のプロキシに対応しているらしく、この記述であれば.bashrcを書き換えなくても通ってしまうことが判った。

$ curl -U : --proxy-ntlm --proxy プロキシサーバ名:ポート名 http://android.git.kernel.org/repo > repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 17451  100 17451    0     0   5510      0  0:00:03  0:00:03 --:--:--  8349

さて、この場合もやはりプロキシの認証情報は必要とされていない。おまけに謎のオプション"-U :"って何だ??

バージョン詳細を見てみると

$ curl -v -V
curl 7.21.1 (i686-pc-mingw32) libcurl/7.21.1 OpenSSL/0.9.8k zlib/1.2.3
Protocols: dict file ftp ftps http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: Largefile NTLM SSL SSPI libz

NTLMサポートがあるバージョンなのは確認した。 ここでやっと本家のmanpageにたどり着く。
cURL - How To Use

やはり"-U"オプションが鍵だった。

-U/--proxy-user <user:password>
Specify the user name and password to use for proxy authentication.

If you use an SSPI-enabled curl binary and do NTLM authentication, you can force curl to pick up the user name and password from your environment by simply specifying a single colon with this option: "-U :".

なるほど、ちゃんと環境から取得してくれるんだ。ということは.bashrcにプロキシの記述をすることでここまでやってくれているという認識の良いのだろう。(本当か?)

私は些末な部分に拘って本質部分を調べるのを後回しにしてしまう癖があるのだが、今回もそうだった。最初からcUrlの本家を調べれば解決にかかった時間は1/10になるはずだが、そもそも本質を理解していないから後回しになるのかもしれない。

ということでrepo syncを実行するだけでこんなにネタの宝庫。UNIXは深いねぇ。