Samba に優しい FDclone なページ


FDclone を Samba server 機の上で使うとなかなか便利ですよという紹介ページです。 FDclone は日本語環境に十分配慮した設計なので、 Samba を運用して一つの環境の中に複数の漢字コードが混在してしまったようなケースにもうまく対応出来ます。
Step 1: 異なる漢字コードを扱うパスを指定しよう

OS 標準の漢字コードは EUC-JP なのに、 Samba で共有している directory 以下には ShiftJIS の filename が沢山、 なんてことはありませんか? EUC-JP の filename なら普通に access 出来るのに、 ShiftJIS の filename なんか文字化けして読めないわコマンド引数に書けないわで、 扱いには大層苦労します。
そんな時には、 Samba で共有している directory を変数 SJISPATH で指定してあげましょう。 SJISPATH の値は「:」で区切って複数記述出来ますが、 共有している一番上の階層の directory だけを指定しておけば十分なので、 普通はそんなにだらだらと長く書く必要はありません。 例えばこんな感じ。

SJISPATH=/usr/share/samba:~/samba
同様に、 CAPPATHUTF8PATH なんて変数も用意されていますので、 Samba 側の設定に応じて適宜使い分けて下さい。

なお、 OS 標準の漢字コードは compile 時にハードコートされているものが使われますが、 この選択肢には EUC-JP と ShiftJIS しかありません。 Mac OS X の UTF-8 のように、 OS 標準の漢字コードとしてこの選択肢に無いものを使う場合は、 変数 FNAMEKCODE で指定して下さい。


Step 2: FDclone を起動しよう

変数を FDclone に与える方法は幾つかありますが、 ここでは手っ取り早くコマンドライン引数で指定してみましょう。 まずは引数無しで起動するとこんな感じに表示されます。

  FD(File & Directory tool) Ver.2.02 (c)1995-2002 T.Shirai   02-11-19 23:36:07  
  Size:              0/         4,096   Total:    8,587,460 KB  Free:    1,888,076 KB 
  Page:  1/ 1  Mark:    0/   4  Sort: 名前順(昇り順)  Find:                             
  Path: /usr/share/samba                                                          
  ./                       <DIR> 02-10-28 14:48:17 shirai   user     drwxr-xr-x
   ../                      <DIR> 02-11-19 23:01:37 shirai   user     drwxr-xr-x  
  :82:a0:82:a2:82:a4/      <DIR> 01-11-26 15:15:04 shirai   user     drwxr-xr-x
  :82:a0:82:a2:82:a4.txt      34 01-11-26 15:15:31 shirai   user     -rw-r--r--



 
 T   Logdir    eXec     Copy    Delete   Rename       Sort     Find     Tree    Editor   Unpack     
drwxr-xr-x 12 shirai   user         8192 02-11-19 23:01 ..

次の例は、 異なる漢字コードを使うパスを

fd -CAPPATH=/usr/share/samba
のようにコマンドライン引数で指定して起動した例です。
  FD(File & Directory tool) Ver.2.02 (c)1995-2002 T.Shirai   02-11-19 23:36:23  
  Size:              0/         4,096   Total:    8,587,460 KB  Free:    1,888,076 KB 
  Page:  1/ 1  Mark:    0/   4  Sort: 名前順(昇り順)  Find:                             
  Path: /usr/share/samba                                                          
  ./                       <DIR> 02-10-28 14:48:17 shirai   user     drwxr-xr-x
   ../                      <DIR> 02-11-19 23:01:37 shirai   user     drwxr-xr-x  
  あいう/                  <DIR> 01-11-26 15:15:04 shirai   user     drwxr-xr-x
  あいう.txt                  34 01-11-26 15:15:31 shirai   user     -rw-r--r--



 
 T   Logdir    eXec     Copy    Delete   Rename       Sort     Find     Tree    Editor   Unpack     
drwxr-xr-x 12 shirai   user         8192 02-11-19 23:01 ..

上の例で「:82:a0:82:a2:82:a4」のように CAP 符号化されたままの形で表示されていた filename が、 下の例では「あいう」のようにちゃんと読める形で表示されていることが判ると思います。
この状態で、 CAPPATH で指定されたパスとそうでないパスとの間で file のコピーや移動を行なうと、 ちゃんとそれぞれのパスに指定された漢字コードに変換された filename になります。 最初に設定しておくだけで、 後はシームレスに異なる漢字コードが混在する環境下で file のやり取りが出来るという次第です。


Step 3: fdsh を起動しよう

FDclone には shell 形態である fdsh という実行 file が存在します。 この名前で起動された FDclone は、 Bourne shell 互換の interface や builtin command を持ちながら、 同時に FDclone の機能を継承し続けています。 その継承する機能の中には、 当然この異なる漢字コードを扱う機能も含まれています。
fdsh ではコマンドライン引数からの変数指定が出来ませんので、 今度は FDclone の初期設定ファイルである ~/.fd2rc で変数設定を行なってから起動してみましょう。

bash[500]$ cat ~/.fd2rc
CAPPATH=/usr/share/samba
bash[501]$ fdsh
$ ls /usr/share/samba                                                  ......(1)
:82:a0:82:a2:82:a4  :82:a0:82:a2:82:a4.txt
$ echo /usr/share/samba/*                                              ......(2)
/usr/share/samba/あいう /usr/share/samba/あいう.txt
$ cp /usr/share/samba/あいう.txt /var/tmp                              ......(3)
cp: /usr/share/samba/あいう.txt: No such file or directory
$ cat < /usr/share/samba/あいう.txt > /var/tmp/あいう.txt              ......(4)
$ ls /var/tmp                                                          ......(5)
あいう.txt
$ evalmacro cp %JA/usr/share/samba/あいう.txt%JA /var/tmp/             ......(6)
$ ls /var/tmp                                                          ......(7)
:82:a0:82:a2:82:a4.txt  あいう.txt
$ 
  1. /usr/share/samba には Step 2 と同じ名前の directory と file が置かれています。 ls は外部コマンドで、 FDclone の機能を持たせることが出来ませんから、 CAP 符号化された filename がそのまま表示されます。
  2. 引数に wildcard を記述すると、 これを展開するのは shell の役目なので、 FDclone の機能が有効になって CAPPATH の指定に従った漢字コード変換がなされます。 (※1)
  3. 外部コマンド cp を用いて file のコピーを試みてみます。 ls の場合と同様に、 cp は CAP 符号化された filename の方しか扱えないので、 ここでは失敗します。
  4. cp と同じ効果を redirect で実行してみます。 この場合に用いた cat は外部コマンドですが、 redirect 時に入出力 file を用意するのは shell の仕事なので、 cat は単純に標準入出力を用いるのみです。 ですから、 cp の場合と異なり、 CAPPATH の指定に従った漢字コード変換がなされます。
  5. コピー先の directory を ls で見てみます。 /var/tmpCAPPATH で指定されていないので、 ちゃんと読める形の filename でコピーされていますね。
  6. 同じことを cp で実現させるには、 FDclone のマクロ機能を利用して cp に CAP 符号化した filename を渡してやる必要があります。 builtin の evalmacro%JA マクロを組み合わせて用いることで、 今度はエラーにならずにコピー出来ました。 %JA マクロは囲まれた範囲の文字列を CAPPATH 等の指定に従って然るべき漢字コードに変換してくれます。
  7. ls でコピー先を確認してみます。 redirect を用いた例と異なり、 CAP 符号化されたままの filename でコピーされてしまいました。 cp に渡されたコピー先の引数は directory 名だけでしたので、 cp はコピー元の filename をそのまま忠実にコピーしたのです。 もしここでコピー先の filename の漢字コードを変えたければ、 cp にコピー先の filename を含めて引数を与えれば良い訳ですね。
このように、 shell 自身が漢字コードを柔軟に扱えるようになっていると、 工夫次第で色々と便利に filename を使いこなすことが可能になります。

(※1)
wildcard の展開結果がこのように漢字コード変換されるのは、 実は一部のケースに限定されています。 echo のような builtin コマンド以外の利用では、 wildcard の展開結果はそのままの漢字コードになります。
例えば、
rm *.txt
とか
for file in *.txt; do rm $file; done
とか
いった script を実行する際に、 wildcard の展開結果が漢字コード変換されてしまっていたのでは期待した結果が得られません。
このため、
  1. builtin コマンド以外の引数
  2. 外部コマンドを呼び出す builtin コマンド eval, exec, command の引数
のように wildcard の展開結果がそのまま外部コマンドに渡される可能性のある箇所では 漢字コード変換をしません。 この例の echo は builtin ですが、 外部コマンドの /bin/echo を用いた場合は CAP 符号化されたままの文字列が表示されることになります。
もし、 外部コマンドに対しても漢字コード変換させたい場合、 evalmacro が builtin であることを利用して、 このコマンドの中で wildcard の展開を行なわせることで漢字コードを変換させることが可能です。


Step 4: kconv を使おう

ここまでの用法では filename に用いられる漢字コードの差異についての話でした。 テキスト文面の漢字コードについては nkficonv 等のテキストコンバータを使えば済むので、 filename の漢字コードに比べれば苦労は少ないと思います。
それでも、 CAP や HEX のような Samba 独自のコード体系については対応しているコンバータが殆ど無いのではないでしょうか? 確かに Samba を使っていても CAP や HEX で記述されたテキストなどは滅多にお目にかかれないとは思いますが、 Samba の吐く log file など、 テキストに利用されてしまうことは皆無ではありません。
そういう時には、 テキストコンバータに FDclone の builtin コマンド kconv を使いましょう。

$ ls /usr/share/samba                                                  ......(1)
:82:a0:82:a2:82:a4  :82:a0:82:a2:82:a4.txt
$ ls /usr/share/samba | kconv -icap                                    ......(2)
あいう あいう.txt
$ 
  1. これは Step 3 の ls の出力例そのままです。
  2. kconv を通すと ls の出力した CAP 符号化された filename が OS 標準の漢字コードに変換されて出力されます。

kconv の書式をマニュアルから抜粋しておきます。

kconv [-i in] [-o out] [infile [outfile]]
infile を読込み、 漢字コードを in から out に変換して outfile に出力します。 in 及び out には後述の環境変数 FNAMEKCODE に用いる文字列が指定出来ます。 省略すると、 コンパイル時に指定された漢字コードが指定されたと見なされます。 outfile を省略すると、 標準出力に出力します。 infile も省略すると、 標準入力から読込みます。
上の例では -i オプションのみ指定してそれ以外は全部省略したため、 出力漢字コードはハードコートされた OS 標準の漢字コードが、 入出力にはそれぞれ標準入力と標準出力が指定されたものと見なされた訳です。

単なるテキストコンバータなので応用範囲はそれほど広くはありませんが、 evalmacro コマンドや %J マクロと組み合わせると重宝すると思います。 漢字コード混在環境では何かと役に立ってくれることでしょう。


Step 5: browse で smbclient を使おう

Samba は主にサーバとして使うものですが、 クライアントとして使えるソフトも付属しています。 smbmount を使うと UNIX 上から Windows 上のファイルシステムを SMB 経由でマウントすることも出来ますし、 smbsh (configure 時に --with-smbwrapper を指定すると作成されます。) を使うと Windows 上のリモートファイルがあたかも手元にあるかのようにファイルを扱うことが出来ます。
しかし、 残念ながらこれらのクライアントツールは Linux など限られた極一部の環境でしか構築することが出来ません。 最近の Samba の開発は Linux への依存度が大きいので、 特に重要ではないこれらのクライアントツールとなると、 可搬性の充実は今後も余り期待出来ないでしょう。

そういった環境依存度の少ないクライアントツールに smbclient があります。 これは FTP のように対話的に SMB アクセスを行なうクライアントで、 smbmount と比較すると操作性では劣りますが、 ファイルの一覧や送受といった最低限のファイルアクセスを行なう機能は実装されています。
FDclone 2.03 で実装された builtin コマンド browse は、 正にそういったクライアントソフトのために開発されたもので、 文字ベースの FTP クライアントソフトをグラフィックベースのブラウザに置換えて操作性を向上させるのに似た効果を得ることが出来ます。

百聞は一見に如かず、 まずは実例を見てみましょう。 下記は browse を用いて smbclient を使う関数定義の例です。

getsamba() {
	SHOST=$1
	browse -@ - <<'EOF'
	'smbclient -L $SHOST'                                          ......(1)
	-f " %f Disk%x"
	-i "added interface *"
	-i "Anonymous login successful"
	-i "Domain=*"
	-i "Sharename      Type      Comment"
	-i "Server               Comment"
	-i "Workgroup            Master"
	-i "---------*"
	-i "*Printer*"
	-i "*IPC*"
	-i "*$ * Disk*"
	-i ""
	-e "tree connect failed: *"
	-e "session setup failed: *"
	-e "Connection to * failed"
	-p "SSHARE=$1; SPATH="

	'smbclient //$SHOST/$SSHARE -c "cd $SPATH; dir"'               ......(2)
	-f "  %30f%7a %s %x %m %d %t %y"
	-i "added interface *"
	-i "Anonymous login successful"
	-i "Domain=*"
	-i "Current directory is*"
	-i "* blocks of size * blocks available"
	-i ""
	-e "tree connect failed: *"
	-e "session setup failed: *"
	-e "Connection to * failed"
	-p 'SPATH=$1; while [ "$#" -gt 2 ]; do shift; SPATH=$1/$SPATH; done'
	-d loop

	'smbclient //$SHOST/$SSHARE -c "get $SPATH ./${SPATH##*/}"'    ......(3)
EOF
}
詳しい技術的解説は割愛しますが、 (1), (2), (3) の三箇所で smnclient を使っていることが判ると思います。 この関数定義を ~/.fd2rc に書いておくと、 FDclone のコマンドラインから「getsamba SMB_SERVER」のようにして SMB サーバにアクセスしブラウジングすることが出来ます。

(1) の smbclient は SMB サーバの共有一覧を取得しています。 この出力には無駄な情報が多いので -i オプションの山になっていますが、 必要な行だけを抽出した結果、 共有名一覧ブラウザが構築されます。 まずはこの一覧の中からアクセスしたい共有名を選択して下さい。
(2) の smbclient は指定された共有の各ディレクトリ一覧を取得しています。 出力の中からファイル属性情報を読み出し、 一覧の中の各ファイルがディレクトリなのか否かを判断します。 ディレクトリを選択すると選択されたディレクトリに対して再びディレクトリ一覧ブラウザを起動します。 ファイルを選択するとファイルのコピーを行ないます。
(3) の smbclient は SMB サーバから指定されたファイルをローカルにコピーしてきます。 先にコピー先のディレクトリを聞いて来ますので適当なディレクトリ名を入力すると、 ローカルの指定ディレクトリにファイルをコピーします。 コピー後は再びディレクトリ一覧ブラウザに戻ります。

ローカルマシン上で nmbd が稼動している場合は、 この nmbd に問い合わせればそのワークグループ内のブラウズリストが入手出来る筈なので、 それを使って (1) の更に一段前に SMB サーバ一覧ブラウザを構築することも可能になるとは思うのですが、 残念ながら現行の Samba の枠組の中ではそういう問い合わせに応じる機能は実装されてはいなさそうです。


戻る