2004-05-08 の 「lftp を使った ftp ミラーリングと便利機能」で試してみたいなと書いた FTP over HTTP proxy を使ってみた。以下、2004-05-08 から引用。
要するに ftp の proxy 越え。
lftp 起動後にコマンドでセットしたり、/etc/lftp.conf または ~/.lftprc または ~/.lftp/rc に書いておくこともできる。ただ、apt や wget、lynx なども同じ環境変数を見るので、環境変数にセットしておいた方がツールごとに設定しなおさなくて済むので楽だ。
ftp://ring.gr.jp/ に FTP Over HTTP Proxy で接続したいときは、hftp://ring.gr.jp/ と指定すればいい。
まずは cygwin 環境。HTTP セッションの流れを詳細に見たいので、-d を付けて lftp を起動。
「--->」がサーバへ送っているデータ、<--- がサーバから返されたデータだ。うまくログインして PUT できている。なるほど、ftp アカウントのパスワードは Authorization ヘッダに入れて squid に送るわけだ。成功時の応答は HTTP レスポンス 201 か。普段は webdav なども使わないので 200番台は 200 OK 以外は見かけないけど、こんなコードがあったのか。
うまくいかない。HTTP の 400番が返ってきてしまう。上記ではわからないが、実際には 400 が返ってきた後 lftp はリトライするためのカウントダウンに入ってしまい、何度でもやり直そうとしていた。仕方がないので CTRL + C で止めた。Interrupt はそのときの表示だ。
ぱっと見では同じリクエストを送ってるようなんだけどなあ。Content-length が違うのは、別のファイルを送っているからだけど、これが影響するとは思えないし。やっぱり lftp のバージョンが古いのが良くないのかな。 確か lftp は2003年末くらいにセキュリティホールが見つかっていたはずだし、最新版を入れてみるか。
トラブル無くインストール完了。では再び lftp。
あ、できた。やっぱりバージョンが古かったのが良くなかったのかな。lftp の ChangeLog を見ても今回のトラブルに関連する修正履歴は見つけられなかったけど、使えるようになったので深く考えないことにしよう。個人的な用途にしか使わないだろうしね。
FTP over HTTP proxy support は、squid を http と ftp の proxy サーバとして使用している環境で有用だろう。IE や Mozilla などのブラウザからは proxy を使って ftp サイトにアクセスできるのに、windows の ffftp をはじめとする ftp クライアントでは proxy を利用できない、という現象がある。これは ffftp などが FTP over HTTP proxy に対応していないために起こる。lftp ならこれを解決できるようだ。
要するに ftp の proxy 越え。
- ftp プロキシと http プロキシの指定
まずは lftp が使うプロキシサーバを指定する。lftp は環境変数 ftp_proxy http_proxy https_proxy にセットされている値を proxy として使う。私は .bash_profile に以下のように記述している。export http_proxy=http://10.24.1.242:24201/
export ftp_proxy=http://10.24.1.242:24201/
export https_proxy=http://10.24.1.242:24201/
lftp 起動後にコマンドでセットしたり、/etc/lftp.conf または ~/.lftprc または ~/.lftp/rc に書いておくこともできる。ただ、apt や wget、lynx なども同じ環境変数を見るので、環境変数にセットしておいた方がツールごとに設定しなおさなくて済むので楽だ。
- lftp で FTP Over HTTP Proxy を使うときは hftp
lftp は hftp スキームで URL を指定すると FTP Over HTTP Proxy を使う、という動きをするようだ。ftp://ring.gr.jp/ に FTP Over HTTP Proxy で接続したいときは、hftp://ring.gr.jp/ と指定すればいい。
- cygwin 環境の lftp 2.6.10 なら問題なく動いた
無料ホームページスペースの geocities に FTP Over HTTP Proxy で接続してみる。まずは cygwin 環境。HTTP セッションの流れを詳細に見たいので、-d を付けて lftp を起動。
$ lftp -d -u USER_ID,PASSWORD hftp://ftp.geocities.co.jp
lftp USER_ID@ftp.geocities.co.jp:~> put test.txt
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> PUT ftp://USERID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/2.6.10
---> Content-length: 192
---> Last-Modified: Wed, 15 May 2002 10:09:52 GMT
---> Authorization: Basic PASSWORD
---> Connection: close
--->
<--- HTTP/1.1 201 Created
<--- Server: Cache/2.4.7
<--- Mime-Version: 1.0
<--- Date: Thu, 13 May 2004 09:35:44 GMT
<--- Content-Type: text/html
<--- Content-Length: 341
<--- Expires: Thu, 13 May 2004 09:35:44 GMT
<--- X-Squid-Error: ERR_FTP_PUT_CREATED 0
<--- X-Cache: MISS from unknown
<--- Age: 3
<--- Connection: close
<--- Via: HTTP/1.0 hostname
<---
---- Closing HTTP connection
192 bytes transferred in 4 seconds (55b/s)
「--->」がサーバへ送っているデータ、<--- がサーバから返されたデータだ。うまくログインして PUT できている。なるほど、ftp アカウントのパスワードは Authorization ヘッダに入れて squid に送るわけだ。成功時の応答は HTTP レスポンス 201 か。普段は webdav なども使わないので 200番台は 200 OK 以外は見かけないけど、こんなコードがあったのか。
- TurboLinux 6.5 Server の lftp は 2.3.7 はうまく動かない
次は TurboLinux Server 6.5 で試す。cygwin 環境があるマシンは24時間稼働ではないので、できれば 24時間稼働で cron も使える Linux マシンで lftp を使いたい。ただ、このマシンにインストールされている lftp はちょっと古めのバージョンだ。$ lftp -d -u USER_ID,PASSWORD hftp://ftp.geocities.co.jp
lftp USER_ID@ftp.geocities.co.jp:~> put test.txt
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> PUT ftp://USERID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/2.3.7
---> Content-length: 903
---> Last-Modified: Fri, 20 Feb 2004 13:20:04 GMT
---> Authorization: Basic PASSWORD
---> Connection: close
--->
**** Hit EOF while fetching headers
---- Closing HTTP connection
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> HEAD ftp://USERID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/2.3.7
---> Authorization: Basic PASSWORD
---> Connection: keep-alive
--->
<--- HTTP/1.1 400 Unsupported FTP Method
<--- Date: Thu, 13 May 2004 09:35:04 GMT
<--- Via: HTTP/1.1 hostname
<--- Connection: close
<--- Cache-Control: no-store
<--- Content-Type: text/html
<--- Content-Language: en
<--- Content-Length: 353
<---
---- Closing HTTP connection
copy: put rolled back to 0, seeking get accordingly
Interrupt
うまくいかない。HTTP の 400番が返ってきてしまう。上記ではわからないが、実際には 400 が返ってきた後 lftp はリトライするためのカウントダウンに入ってしまい、何度でもやり直そうとしていた。仕方がないので CTRL + C で止めた。Interrupt はそのときの表示だ。
ぱっと見では同じリクエストを送ってるようなんだけどなあ。Content-length が違うのは、別のファイルを送っているからだけど、これが影響するとは思えないし。やっぱり lftp のバージョンが古いのが良くないのかな。 確か lftp は2003年末くらいにセキュリティホールが見つかっていたはずだし、最新版を入れてみるか。
- lftp 3.0.3 をインストールして再挑戦
ミラーサイトから tar ball を取ってきてコンパイル & インストール。tar zxvf lftp-3.0.3.tar.gz
cd lftp-3.0.3/
./configure
make
su
make install
トラブル無くインストール完了。では再び lftp。
$ lftp -d -u USER_ID,PASSWORD hftp://ftp.geocities.co.jp
lftp USER_ID@ftp.geocities.co.jp:~> put test.txt
---- Connecting to proxy 10.24.1.242 (10.24.1.242) port 24201
---- Sending request...
---> PUT ftp://USER_ID@ftp.geocities.co.jp/test.txt;type=i HTTP/1.1
---> Host: ftp.geocities.co.jp
---> User-Agent: lftp/3.0.3
---> Content-length: 903
---> Last-Modified: Fri, 20 Feb 2004 13:20:04 GMT
---> Authorization: Basic PASSWORD
---> Connection: close
--->
<--- HTTP/1.1 201 Created
<--- Server: Cache/2.4.7
<--- Mime-Version: 1.0
<--- Date: Thu, 13 May 2004 10:07:29 GMT
<--- Content-Type: text/html
<--- Content-Length: 341
<--- Expires: Thu, 13 May 2004 10:07:29 GMT
<--- X-Squid-Error: ERR_FTP_PUT_CREATED 0
<--- X-Cache: MISS from unknown
<--- Age: 4
<--- Connection: close
<--- Via: HTTP/1.0 hostname
<---
---- Closing HTTP connection
903 bytes transferred in 4 seconds (231b/s)
あ、できた。やっぱりバージョンが古かったのが良くなかったのかな。lftp の ChangeLog を見ても今回のトラブルに関連する修正履歴は見つけられなかったけど、使えるようになったので深く考えないことにしよう。個人的な用途にしか使わないだろうしね。
- lftp --help の日本語訳
--help だけは日本語化されてたのでメモ。man は残念ながら英語版のみだった。$ lftp --help
使い方: lftp [OPTS] <site>
`lftp' は rc ファイルを読み込んだあと最初に実行されるコマンドです
-f <file> ファイルで指定されたコマンドを実行し終了する
-c <cmd> コマンドを実行して終了する
--help このヘルプを表示して終了する
--version lftp のバージョンを表示して終了する
他のオプションは `open' コマンドのものと同じです
-e <cmd> 選択のすぐあとに指定のコマンドを実行する
-u <user>[,<pass>] 認証で指定のユーザ/パスワードを使う
-p <port> 接続に指定のポートを使う
<site> ホスト名、URL あるいはブックマーク名
以上の内容はhttp://sonic64.com//2004-05-11.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます
モバイルやる夫Viewer Ver0.14