Re: ftpd の glob 展開について
高津@ドーガです。
記事 <YAS.05Mar29233353@kirk.is.tsukuba.ac.jp> で
Yasushi Shinjoさんは書きました
> ftp (クライアント)のコマンドに glob というのがありますよね。
> それで、glob するかしないかのトグルになっています。mput,
> mget, mdelete など m がつくもので。逆に、m が付かないなら、
> もともとは、glob してはいけないということかなあ。
ftpクライアントのソースをちょっと見てみたのですが、glob はクライアント側の
設定を変えるコマンドで、mget・mput のglob展開はローカルでやってますね。
mget なんかは、クライアント側で
・NLST でファイル一覧を取る
・globに合うファイル群を抽出する
・個々のファイルをgetする
といったコードになってます。
私が出くわした問題は、mのつかない get、put で発生するものです。
おそらく delete、rmdir、mkdir、などでも同じことになるかと思います。
でもって、get/putで、クライアント側でローカルのファイル名については
glog展開しないので、例えば、
> put test?.txt
を実行した場合、
・ローカル側には'test?.txt'という名前のファイルが存在する必要がある
・リモート側に存在する test?.txt にマッチするファイル数によって
・0個の場合→ 'test?.txt'という名前でアップロードされる
・1個の場合→ そのファイル名でアップロード(上書き)される
・2個以上の場合→ エラーになる
という挙動になります。
以下、実行例です。(無駄なメッセージは削除してます)
% uname -a
FreeBSD eden.4koma.jp 5.1-RELEASE FreeBSD 5.1-RELEASE #2: Tue Jul 22 01:14:36 JST 2003 taka2@eden.4koma.jp:/usr/src/sys/i386/compile/koma4 i386
% touch 'test?.txt'
% ls
test?.txt
% ftp localhost
・リモート側にマッチするファイルが0個の場合
ftp> cd ftptest/test0
ftp> ls
150 Opening ASCII mode data connection for '/bin/ls'.
226 Transfer complete.
ftp> put test?.txt
local: test?.txt remote: test?.txt
150 Opening BINARY mode data connection for 'test?.txt'.
ftp> ls
-rw-r--r-- 1 taka2 wheel 0 Mar 30 10:39 test?.txt
・リモート側にマッチするファイルが1個だけある場合
ftp> cd ../test1
ftp> ls
-rw-rw-r-- 1 taka2 wheel 0 Mar 30 10:34 test1.txt
ftp> put test?.txt
local: test?.txt remote: test?.txt
150 Opening BINARY mode data connection for 'test1.txt'.
ftp> ls
-rw-rw-r-- 1 taka2 wheel 0 Mar 30 10:39 test1.txt
・リモート側にマッチするファイルが2個ある場合
ftp> cd ../test2
ftp> ls
-rw-rw-r-- 1 taka2 wheel 0 Mar 30 10:34 test1.txt
-rw-rw-r-- 1 taka2 wheel 0 Mar 30 10:34 test2.txt
ftp> put test?.txt
local: test?.txt remote: test?.txt
229 Entering Extended Passive Mode (|||54483|)
550 ambiguous
ftp>
PROJECT TEAM DoGA 高津正道 taka2@doga.jp
TBD00456@nifty.ne.jp
PROJECT TEAM DoGAのホームページ → http://doga.jp/
3月30日(水) 今日のマーフィーの法則 [カーリンシーの定義]
バスとは、自分が待っているのと反対側の車線を、行きたい方向と逆に走る乗物である。
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735