品質があまり良くない回線で ftp ミラーリングを行うことになった。リトライ機能付きの ftp クライアントを使いたいが、リトライの上限回数も決めておきたい。2004-05-08 などで書いた lftp を使おうと思っているので、man page を調べてみる。
lftp.1
http://lftp.yar.ru/lftp-man.html
0で無制限。1以上でその回数分リトライか。
- lftp のリトライ回数制御
リトライの回数は net:max-retries で制御可能。lftp.1
http://lftp.yar.ru/lftp-man.html
net:max-retries (number)
the maximum number of sequential retries of an opera-
tion without success. 0 means unlimited.
0で無制限。1以上でその回数分リトライか。
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 あるいはブックマーク名
lftp は高機能な ftp クライアント。
http://lftp.yar.ru/
オフィシャルサイトの Feature list と Man page を読めば、ftp 関連でやりたいと思うことは lftp でたいてい実現できることがわかる。
Feature list http://lftp.yar.ru/features.html
Man page http://lftp.yar.ru/lftp-man.html
Feature list から、対応しているプロトコルを引用。他にもいろいろ書いてあった。
http://lftp.yar.ru/features.html
ミラーリング時のオプションも豊富だ。ローカルに存在しなくてミラー先にのみ存在するファイルを削除するかどうか指定できるし、ミラーリング対象ファイルを正規表現で絞り込んだり、タイムスタンプで比較して新しいファイルのみをミラーしたりと、かゆいところに手が届くような機能ばかりだ。
以下 man page から抜粋。
http://lftp.yar.ru/lftp-man.html
以下、そのうち試したい機能。
FTP over HTTP proxy support は、squid を http と ftp の proxy サーバとして使用している環境で有用だろう。IE や Mozilla などのブラウザからは proxy を使って ftp サイトにアクセスできるのに、windows の ffftp をはじめとする ftp クライアントでは proxy を利用できない、という現象がある。これは ffftp などが FTP over HTTP proxy に対応していないために起こる。lftp ならこれを解決できるようだ。
追記。FTP over HTTP proxy support によるプロキシ越えは 2004-05-11 で実際に試してみた。
- lftp オフィシャルサイト
LFTP - reliable ftp clienthttp://lftp.yar.ru/
オフィシャルサイトの Feature list と Man page を読めば、ftp 関連でやりたいと思うことは lftp でたいてい実現できることがわかる。
Feature list http://lftp.yar.ru/features.html
Man page http://lftp.yar.ru/lftp-man.html
Feature list から、対応しているプロトコルを引用。他にもいろいろ書いてあった。
http://lftp.yar.ru/features.html
* FTP and HTTP protocols support.
* FTP (e.g. TIS FWTK) proxy support.
* HTTP proxy support.
* FTP over HTTP proxy support (hftp).
* HTTPS and FTPS protocols support using OpenSSL library.
* Automatic OPIE/SKEY support in FTP protocol.
* FXP transfers support (between two FTP servers, bypassing client machine).
* FTP listings support: unix-style, NT, EPLF.
* Automatic reconnect and retry of an operation on retriable errors or timeout.
* IPv6 support in both FTP and HTTP.
* FISH protocol support. It uses ssh with no special program on server side.
* SFTP protocol v3 and v4 support.
* HTTP/1.1 keep-alive support.
* Experimental support for SRV DNS records.
* SOCKS support (configure option).
- インストール
lftp はたいていの Linux ディストリビューションに含まれているようで、最初からインストールされていることが多い。私の cygwin にはインストールしていなかったが、cygwin 用 lftp のパッケージが用意されていて、cygwin の公式インストーラからインストールできた。cygwin の setup.exe http://www.cygwin.com/setup.exe を起動して lftp を選ぶだけだ。- 私の lftp コマンド
ローカルのファイル群を infoseek に ftp ミラーリングアップロードしている。$ lftp -c "open ftp.isweb.infoseek.co.jp && user USER_NAME PASSWORD && lcd /home/hiroaki/public_html/log && cd / && mirror -R -I 2002* & mirror -R -I 2003* & mirror -R -I 2004* && mirror -R -i '^dat.*|^cat.*|^all.*|^cl.*|^i.*'"
- lftp の便利な機能1 ミラーリングアップロード とミラーリングダウンロード
要するにローカルとリモートのファイルを同期させる機能。普通の無料ホームページサービスは ftp くらいしかアップロードする方法がない。rsync が使えるなら rsync で良いけど、rsync を使える無料ホームページサービスは少ないだろう。ミラーリングが使えるとローカルで html の出来をチェックしさえすれば、同じものがサーバにも置かれることになるのでとても便利だ。ミラーリング時のオプションも豊富だ。ローカルに存在しなくてミラー先にのみ存在するファイルを削除するかどうか指定できるし、ミラーリング対象ファイルを正規表現で絞り込んだり、タイムスタンプで比較して新しいファイルのみをミラーしたりと、かゆいところに手が届くような機能ばかりだ。
以下 man page から抜粋。
http://lftp.yar.ru/lftp-man.html
mirror [OPTS] [source [target]]
Mirror specified source directory to local target directory.
If target directory ends with a slash, the source base name
is appended to target directory name. Source and/or target
can be URLs pointing to directories.
-c, --continue continue a mirror job if possible
-e, --delete delete files not present at remote site
--delete-first delete old files before transferring new ones
-s, --allow-suid set suid/sgid bits according to remote site
--allow-chown try to set owner and group on files
--ignore-time ignore time when deciding whether to download
--ignore-size ignore size when deciding whether to download
--only-missing download only missing files
-n, --only-newer download only newer files (-c won't work)
-r, --no-recursion don't go to subdirectories
-p, --no-perms don't set file permissions
--no-umask don't apply umask to file modes
-R, --reverse reverse mirror (put files)
-L, --dereference download symbolic links as files
-N, --newer-than=SPEC download only files newer than specified time
-P, --parallel[=N] download N files in parallel
--use-pget[-n=N] use pget to transfer every single file
-i RX, --include RX include matching files
-x RX, --exclude RX exclude matching files
-I GP, --include-glob GP include matching files
-X GP, --exclude-glob GP exclude matching files
-v, --verbose[=level] verbose operation
--log=FILE write lftp commands being executed to FILE
--script=FILE write lftp commands to FILE, but don't execute them
--just-print, --dry-run same as --script=-
--use-cache use cached directory listings
--Remove-source-files remove files after transfer (use with caution)
-a same as --allow-chown --allow-suid --no-umask
- lftp の便利な機能2 ミラーリング時の自動再試行
http://lftp.yar.ru/features.htmlAutomatic reconnect and retry of an operation on retriable errors or timeout.自動再試行は便利だ。致命的でないエラーの時とタイムアウトの時は自動でリトライする。つまり、回線やサーバの ftpd が不安定だったりするときは自動でリトライしてくれる。この機能は非常にうれしい。infoseek の ftpd は混雑時は不安定になりがちだが、自動リトライ機能のおかげで安心して ftp できる。自動再試行についても、再試行回数や再試行間隔などのオプションが用意されている。詳細は man page を参照。
- lftp の便利な機能3 スクリプトファイルによる自動実行
ftp セッション中に実行したいコマンドをあらかじめ記述しておき、それを lftp に渡せば実行してくれるというもの。2003-12-01 に書いた「ftp: ftp + tar + cron で自動ネットワーク・バックアップ」で利用している機能だ。cron と組み合わせると定型的な作業を自動化できる。- lftp の便利な機能4 ジョブ制御
シェルに似たジョブの制御ができる。コマンドの最後に & を付けるとバックグラウンド実行になる。私の lftp コマンドでも & を付けているが、どこまで効果があるかは不明。複数の ftp セッションを開いて並行にアップロードしているのかどうか確かめてはいない。あとで確認しよう。- 他にも機能がいっぱい
lftp はとにかく高機能。man もそれだけ長いが、読む価値はある。perl や ruby で独自に ftp クライアントを実装するよりも、lftp を使った方が早くて確実だ。以下、そのうち試したい機能。
FTP over HTTP proxy support (hftp).
`pget' to download a file using several connections.
FTP over HTTP proxy support は、squid を http と ftp の proxy サーバとして使用している環境で有用だろう。IE や Mozilla などのブラウザからは proxy を使って ftp サイトにアクセスできるのに、windows の ffftp をはじめとする ftp クライアントでは proxy を利用できない、という現象がある。これは ffftp などが FTP over HTTP proxy に対応していないために起こる。lftp ならこれを解決できるようだ。
追記。FTP over HTTP proxy support によるプロキシ越えは 2004-05-11 で実際に試してみた。
* ftp + tar + gpgで暗号化ネットワーク・バックアップ
この記事の直リンクURL: Permlink | この記事が属するカテゴリ: [Linux] [gpg] [ftp] [バックアップ]
ftp を使ったネットワークバックアップについての記事を 2003-12-01 に書いた。この手法の欠点の一つは、暗号化されないことだ。ftp に暗号化機能がないので仕方がないが、他のツールを組み合わせれば、暗号化できる。
通信経路の暗号化とファイルの暗号化のどちらが良いかは場合による。もちろん両方やっても良い。バックアップ先が共用のファイルサーバで、そのサーバの管理者を含め、自分以外のユーザがアクセスする可能性があるなら、ファイルそのものを暗号化したほうがいいだろう。
一方、バックアップ先が自分しかアクセスしないサーバだったら、通信経路上だけを暗号化してファイルを生で保存しておいた方が便利だろう。いざディスクがクラッシュして復旧しようとしているのに、暗号化解除のパスワードがわからない、といったトラブルも防げる。また、ファイルを暗号化しただけでは ftp のアカウントのパスワードが生のままネットワーク上を流れてしまうが、通信経路自体を暗号化すればこれも解決できる。
Q. cron 等から起動されるバッチ処理の中で ssh を利用したいのですが、ログインを自動化するにはどうすればよいですか?
http://www.jp.freebsd.org/QandA/HTML/2255.html
tar の出力を gpg に通して暗号化してやればいいのだが、私が使っている ftp コマンドは送信ファイル指定部分にパイプを使ったコマンドラインを記述できないようなので、該当部分はシェルスクリプトにした。
以下のようなスクリプトを用意して、tar で固めたデータを暗号化して出力できるようにする。
これを 2003-12-01 の ftp バックアップスクリプトで呼ぶだけだ。tar で出力したファイルを暗号化しているので、拡張子に .gpg を付けている。
gpg 自体が圧縮機能を持っているので、gzip する必要性は薄いかもしれない。そのあたりはお好みで。
- 何を暗号化するか
暗号化には通信経路上の暗号化とファイルの暗号化がある。通信経路上の暗号化だと、バックアップ先サーバへたどり着いた後のファイルは生のままになる。ファイルの暗号化だと、バックアップ先サーバに到達した後もファイルはずっと暗号化されたままだ。通信経路の暗号化とファイルの暗号化のどちらが良いかは場合による。もちろん両方やっても良い。バックアップ先が共用のファイルサーバで、そのサーバの管理者を含め、自分以外のユーザがアクセスする可能性があるなら、ファイルそのものを暗号化したほうがいいだろう。
一方、バックアップ先が自分しかアクセスしないサーバだったら、通信経路上だけを暗号化してファイルを生で保存しておいた方が便利だろう。いざディスクがクラッシュして復旧しようとしているのに、暗号化解除のパスワードがわからない、といったトラブルも防げる。また、ファイルを暗号化しただけでは ftp のアカウントのパスワードが生のままネットワーク上を流れてしまうが、通信経路自体を暗号化すればこれも解決できる。
- 通信の暗号化
通信の暗号化を組み合わせたネットワークバックアップは、やったことがないのでとくに書かない。ssh、scp、sftp を使ったり、VPN を使ったり、方法はいくらでもあると思う。一応 ssh を使ったやり方について記事を見つけたのでメモしておく。Q. cron 等から起動されるバッチ処理の中で ssh を利用したいのですが、ログインを自動化するにはどうすればよいですか?
http://www.jp.freebsd.org/QandA/HTML/2255.html
- ファイルの暗号化
暗号化できるならどんなツールでもいいが、今回の用途で使うならば、自動化ができて、強い暗号強度を持ち、無償で利用できるものがいい。この条件を満たす暗号化ツールとしては gpg がある。2004-01-08 に書いた「gpg: ファイルをパスワード/パスフレーズだけで暗号化/復号する」や「gpg: 標準入力からパスフレーズを渡してバッチ処理でファイルを暗号化」が参考になるだろう。tar の出力を gpg に通して暗号化してやればいいのだが、私が使っている ftp コマンドは送信ファイル指定部分にパイプを使ったコマンドラインを記述できないようなので、該当部分はシェルスクリプトにした。
以下のようなスクリプトを用意して、tar で固めたデータを暗号化して出力できるようにする。
#!/bin/sh
PASS_PHRASE="passphrase"
TAR_TARGET="script etc"
BASE_DIR=/home/hiroaki
echo $PASS_PHRASE | { tar -C $BASE_DIR -zcf - $TAR_TARGET 2>/dev/null |gpg --batch -c --passphrase-fd 3;} 3>&0
これを 2003-12-01 の ftp バックアップスクリプトで呼ぶだけだ。tar で出力したファイルを暗号化しているので、拡張子に .gpg を付けている。
ftp -i -v -n 10.39.38.89 << END
user USER_ID PASSWORD
cd /d/backup
bin
put |/home/hiroaki/script/hgpg.sh "backup_`date +%a`.tar.gz.gpg"
quit
END
gpg 自体が圧縮機能を持っているので、gzip する必要性は薄いかもしれない。そのあたりはお好みで。
以下の環境の時、delegate <-> ftp server の接続方法を強制する。
DeleGate version 8.7 リファレンスマニュアル の日本語訳
http://irish.ubiq.reset.jp/docs/Manual.htm#FTPCONF
client <-> delegate <-> ftp server
- 何のためにこの設定をするのか?
たとえば、途中に ファイアウォールがあるため、pasv で接続しようとすると弾かれてしまう場合、この設定をすることで ftp 接続を確立できるようになる。- 設定方法
delegate 起動時のオプションに、FTPCONF=nopasv を追加する。/usr/local/bin/delegated SERVER=ftp VARDIR=/var/delegate ADMIN="admin@example.com" FTPCONF=nopasv
DeleGate version 8.7 リファレンスマニュアル の日本語訳
http://irish.ubiq.reset.jp/docs/Manual.htm#FTPCONF
FTPCONF parameter* == FTPCONF=ftpControl[:{sv|cl}]
ftpControl == nopasv | noport | noxdc | rawxdc
-- default: none
nopasv
データ接続の PASV コマンドを使用不可とする。
noport
データ接続の PORT コマンドを使用不可とする。
noxdc
制御接続で、データ伝送の XDC モードを使用不可にする。
rawxdc
XDC モードにおいて、伝送データをBASE64エンコードしない。
上で列挙された ftpControl は、"nopasv:sv" のように ":sv" または ":cl" がつづく場合、例えば、ftpControl は、それぞれ、サーバ側、または、クライアント側のみに適用されます。
以前作ったメモを発掘。2002年6月11日の時点では ChangeLog メモを使ってなかったので未収録だった。
delegate 構築メモ
作成者 : 齋藤宏明 (example@example.com)
作成日 : 2002年06月11日
ダウンロードとインストール :
http://www.delegate.org/delegate/ から DeleGate/7.9.5 (May 22, 2002) 、
delegate7.9.5.tar.gz をダウンロードした。
tar ball を展開。
[hiroaki@sonic hiroaki]$ tar zxvf delegate7.9.5.tar.gz
[hiroaki@sonic hiroaki]$ cd delegate7.9.5
configure なしでいきなり make
[hiroaki@sonic delegate7.9.5]$ make
Enter your E-mail address [hiroaki@sonic]: example@example.com
で、メールアドレスを入力。
あとは自動的に make が進む。
src/delegated がバイナリ。これを /usr/local/bin にコピーする。
/var/delegate を作成。
/var/delegate/log を作成
/var/delegate/work を作成。
起動用スクリプト /etc/rc.d/init.d/delegated.rc を作成。
#!/bin/sh
/usr/local/bin/delegated SERVER=ftp VARDIR=/var/delegate ADMIN="example@example.com" MAXIMA=delegated:32
inetd と tcpwrapper の設定
/etc/inetd.conf に以下の記述を追加。
ftp-proxy stream tcp nowait root /usr/sbin/tcpd /etc/rc.d/init.d/delegated.rc
/etc/hosts.allow に以下の記述を追加。
# ftp-proxy
delegated.rc: 10.42.2., 10.31.3.
/etc/services に ftp-proxy を追加
ftp-proxy 8021/tcp # ftp-proxy
上記設定を有効にするために、inetd を再起動。
ftp クライアントからの接続の仕方 :
ftp で 10.50.2.54 8021 へ接続。
ユーザ名@接続したいホスト名 を入力。
接続したいホストのパスワードを入力。
ex) ftp 10.50.2.54 8021
user hiroaki@10.24.3.1
Password:*********
これで接続完了。
以上
- logrotate の設定
/etc/logrotate.d/delegate に記述。/var/delegate/log/8021 {
monthly
rotate 60
create
}
/var/delegate/log/8021.ftp {
monthly
rotate 60
create
}
mget でできるかな、と思ったら、うまくいかない。TurboLinux 6.5 Server 付属のバージョン・制作者不明の ftp クライアントでは、ローカルにディレクトリが存在していない場合、作製してくれない。ローカルにディレクトリを作成しないのに、get するときはリモートのファイルパスに従った位置にファイルを配置しようとするため、No such file or directory エラーが続出する。WindowsXP 付属のftp クライアントでもディレクトリは作ってくれない。ただし、カレントディレクトリに全部落としてくるという形での get はできた。ftp コマンドだけでは今回の目的は達成するのは難しそうだ。
Google で ftp 再帰的 で検索したところ、いくつかヒット。再帰的に取得したいなら、wget や ncftp を使うのが普通なようだ。
ncftp & wget を使う
http://libra.higashi.hit-u.ac.jp/~takaira/paradise/manual/nc ...
Google で ftp 再帰的 で検索したところ、いくつかヒット。再帰的に取得したいなら、wget や ncftp を使うのが普通なようだ。
ncftp & wget を使う
http://libra.higashi.hit-u.ac.jp/~takaira/paradise/manual/nc ...
http,ftpプロトコルによるファイルのダウンロードによく使われるのが wget です。こちらは再帰的取得やレジュームの機能を備えた強力で、かつ使い勝手のいいソフトです。
wget -r 再帰的取得、mや kと組み合わせてウェブページをミラーすることも可能
-b バックグラウンドで勝手に落して来てくれます。
-c レジューム
-i ファイルからURL を読み込む
あたりはよく使います。
設定ファイルは、/etc/wgetrc や~/.wgetrc にて行います。プロキシの設定などは、いじっておいた方が良さそうです。デフォルトでプロキシの利用はオンです。
一時的にプロキシの ON/OFF をコントロールするには、例えばオフにするには、
$ wget -Y off http://hogehoge/hoge.html
どこぞのサイトにあるページ全体をローカルにミラーするのも、いとも簡単。それ以外のオプションも、あると便利なものばかり、ただし使い過ぎには注意。相手のサイトの迷惑にならない範囲でやりましょう。
ftp サイトをまるごとミラーするには、
$ wget -mck ftp://ftp.jaist.ac.jp/pub/os/linux/kondara/Kondara/i586/
とか。
ftp コマンドには、標準入力から読ませたデータに好きなファイル名を付けてアップロードする機能がある。これを利用してネットワークバックアップスクリプトを作成する。スクリプトを毎日 cron で回せば、リモートマシンに毎日バックアップを自動で ftp アップロードすることができる。
暗号化については、tar の出力を gpg に通したり、scp や sftp を利用すれば解決できる。2004-03-19 に「ftp + tar + gpgで暗号化ネットワーク・バックアップ」という記事を書いた。 ftp + tar + gpg の利用について解説とサンプルスクリプトがある。
Manpage of FTP
http://www.linux.or.jp/JM/html/netkit/man1/ftp.1.html
-i
-v
-n
<< END は、次に END が出てくるまでに記述された内容を、ftp コマンドに渡すためのリダイレクト。>>$LOG は ftp コマンドの結果を $LOG に追記する。
put で始まる行がこのスクリプトの要となる部分。
tar の部分を解説しよう。
以下の部分は put コマンドの第2引数として扱われる。
- ftp + tar によるバックアップの長所と短所
ftp + tar を使ったバックアップの長所は、どちらも unix システムなら標準でインストールされているコマンドなので、ツールのインストールが不要で設定が超簡単なことと、ネットワーク経由のバックアップなので外部マシンにデータを持っていくことが楽なことだ。短所は、ネットワーク経由のバックアップなので帯域が細い環境では使いにくいかもしれないこと、ftp アカウントが必要なこと、暗号化されないこと、ftp アカウントをシェルスクリプト中に埋め込まなければならないことだろうか。暗号化については、tar の出力を gpg に通したり、scp や sftp を利用すれば解決できる。2004-03-19 に「ftp + tar + gpgで暗号化ネットワーク・バックアップ」という記事を書いた。 ftp + tar + gpg の利用について解説とサンプルスクリプトがある。
- バックアップで一番大切なこと
バックアップで一番大切なことは、バックアップすることだ。手間がかかるからといってやらないでいる時に限ってトラブルがやってくる。だから、とにかくまず手間がかからなくてシンプルな方法を考えよう。rsync や samba を使ったり、pdumpfs や afio や ArcServe などのバックアップツールを使った方法もある。tar + ftp よりも他の方法を使った方が楽にバックアップシステムを構築できるなら、迷わず楽な方を使った方が良い。とにかくまずバックアップすることが大切だ。- ftp にコマンドの出力結果をアップロードさせる
冒頭にも書いたが、ftp コマンドには標準入力の内容をアップロードする機能がある。これを利用してバックアップスクリプトを作成する。以下、man ページから引用。Manpage of FTP
http://www.linux.or.jp/JM/html/netkit/man1/ftp.1.html
ファイル名の変換
ftp の引き数として指定されたファイル名は、以下の規則に従って変更される。
1. ファイル名として `- ' が指定された場合、(読み込みとして) stdin が、(書き出しとして) stdout が使われる。
2. ファイル名の最初の文字が `|' の場合、残りの引き数はシェルコマンドとして解釈される。そして、 ftp は与えられた引き数を popen(3) に渡してシェルを fork し、stdout を読み込み、stdin に書き出す。シェルコマンドがスペースを含む場合、 " ls -lt" のように引き数をクォートしなければならない。この機構の特に役立つ例としては、dir more がある。
- バックアップスクリプトの例
tar から標準出力に出力した内容を ftp が標準入力で受けてアップロードする。ファイル名に曜日を使っているので、7世代までバックアップが残る。ファイル名に日付を使えば、一か月前まで残せる。#!/bin/sh
# log setting
LOGDIR=/var/log
LOG=$LOGDIR/ftpbackup.log
LOG_TAR=$LOGDIR/ftpbackup_tar.log
echo `date` backup start >>$LOG
echo `date` backup start >>$LOG_TAR
# ftp and tar backup start
ftp -i -v -n 10.3.31.89 << END >>$LOG
user USER_ID PASSWORD
cd /d/backup
bin
put |"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR" "`hostname`_`date +%a`.tar.gz"
quit
END
echo `date` backup complete >>$LOG_TAR
echo `date` backup complete >>$LOG
- 解説
以下ではコマンドのオプションや使われ方を解説する。細かく書いたので長い。必要なところだけ読んでほしい。ftp -i -v -n 10.3.31.89 << END >>$LOG-i オプションはバッチ処理のために、-v はログに詳細を記録するために、-n は .netrc ファイルを使用せずに ftp サーバへのログインに使用するパスワードを指定するためにここで指定している。10.3.31.89 は今回使用した ftp サーバ名。
-i
複数のファイルの転送中に対話 (interactive) プロンプトを出さないようにする。
-v
詳細表示 (verbose) オプションを使うと、 ftp はデータ転送の結果だけでなく、リモートサーバからの全てのレスポンスを表示する。
-n
ftp が最初の接続で 自動ログイン (auto-login) しようとするのを抑制する。自動ログインが可能な場合、 ftp はユーザーのホームディレクトリにある .netrc ファイル ( netrc(5) を参照) でリモートマシンのアカウントが記述されているエントリをチェックする。エントリがない場合、 ftp はリモートマシンのログイン名 (デフォルトではローカルマシンでログイン名) を要求するプロンプトを出す。必要ならば、ログインに使うパスワードとアカウントを要求するプロンプトを出す。
<< END は、次に END が出てくるまでに記述された内容を、ftp コマンドに渡すためのリダイレクト。>>$LOG は ftp コマンドの結果を $LOG に追記する。
user USER_ID PASSWORDUSER_ID に ftp サーバにログインするための ID を指定、PASSWORD にパスワードを指定。例を挙げておこう。ID が operator で パスワードが backup_command なら、
cd /d/backup
bin
user operator backup_commandとすればよい。その後はログイン後に実行させるコマンドを列記する。私が使っているサーバではバックアップファイルをアップロードするディレクトリが /d/backup なので、cd コマンドでディレクトリを移動。その後転送モードをバイナリモードに明示的に変更。
put で始まる行がこのスクリプトの要となる部分。
put |"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR" "`hostname`_`date +%a`.tar.gz"まず put コマンドでファイルをアップロードする。ただし、put の第一引数は | で始まっているので、アップロードする中身はファイルではなく "" で囲まれた tar コマンドが出力したものとなる。"" で囲まれた部分はパイプを使ったコマンドラインは記述できないようだ。パイプを使った複雑なコマンドラインを書きたい場合は、シェルスクリプトにすればいい。
tar の部分を解説しよう。
"tar -C / -zvcf - etc home --exclude=music --exclude=backup 2>>$LOG_TAR"まず -C で tar を実行するディレクトリを / に移動し、その中の etc ディレクトリと home ディレクトリをバックアップ対象としている。ただし、music または backup という名のファイルやディレクトリはバックアップ対象から除外する。-z が指定されているのでこれらを gzip で圧縮し、-f - が指定されているので圧縮結果を標準出力に出力している。2>>$LOG_TAR の部分は、tar コマンドの標準エラー出力への出力結果を $LOG_TAR に追記している。tar は標準エラー出力に詳細を出力するので、それを受けてログに書いているというわけだ。
以下の部分は put コマンドの第2引数として扱われる。
"`hostname`_`date +%a`.tar.gz"put は第2引数でアップロード先にどんなファイル名で格納するかを指定できる。ここでは、 hostname コマンドの出力結果と date +%a コマンドの出力結果を利用している。date +%a は現在の曜日を返す。よって、マシン名が sonic で 今日が火曜日だとすると、最終的なファイル名は sonic_Tue.tar.gz となる。ehco で表示させるとわかりやすいかな。
[hiroaki@sonic ~]$ echo `hostname`_`date +%a`.tar.gz
sonic_Tue.tar.gz