OS 標準の漢字コードは EUC-JP なのに、
Samba で共有している directory 以下には ShiftJIS の filename が沢山、
なんてことはありませんか?
EUC-JP の filename なら普通に access 出来るのに、
ShiftJIS の filename なんか文字化けして読めないわコマンド引数に書けないわで、
扱いには大層苦労します。
そんな時には、
Samba で共有している directory を変数 SJISPATH で指定してあげましょう。
SJISPATH の値は「:」で区切って複数記述出来ますが、
共有している一番上の階層の directory だけを指定しておけば十分なので、
普通はそんなにだらだらと長く書く必要はありません。
例えばこんな感じ。
SJISPATH=/usr/share/samba:~/samba |
なお、 OS 標準の漢字コードは compile 時にハードコートされているものが使われますが、 この選択肢には EUC-JP と ShiftJIS しかありません。 Mac OS X の UTF-8 のように、 OS 標準の漢字コードとしてこの選択肢に無いものを使う場合は、 変数 FNAMEKCODE で指定して下さい。
変数を FDclone に与える方法は幾つかありますが、 ここでは手っ取り早くコマンドライン引数で指定してみましょう。 まずは引数無しで起動するとこんな感じに表示されます。
|
次の例は、 異なる漢字コードを使うパスを
fd -CAPPATH=/usr/share/samba |
|
上の例で「:82:a0:82:a2:82:a4」のように CAP 符号化されたままの形で表示されていた filename が、
下の例では「あいう」のようにちゃんと読める形で表示されていることが判ると思います。
この状態で、
CAPPATH で指定されたパスとそうでないパスとの間で file のコピーや移動を行なうと、
ちゃんとそれぞれのパスに指定された漢字コードに変換された filename になります。
最初に設定しておくだけで、
後はシームレスに異なる漢字コードが混在する環境下で file のやり取りが出来るという次第です。
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) |
|
ここまでの用法では filename に用いられる漢字コードの差異についての話でした。
テキスト文面の漢字コードについては nkf や iconv 等のテキストコンバータを使えば済むので、
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 $ |
kconv の書式をマニュアルから抜粋しておきます。
|
単なるテキストコンバータなので応用範囲はそれほど広くはありませんが、 evalmacro コマンドや %J マクロと組み合わせると重宝すると思います。 漢字コード混在環境では何かと役に立ってくれることでしょう。
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) の smbclient は SMB サーバの共有一覧を取得しています。
この出力には無駄な情報が多いので -i オプションの山になっていますが、
必要な行だけを抽出した結果、
共有名一覧ブラウザが構築されます。
まずはこの一覧の中からアクセスしたい共有名を選択して下さい。
(2) の smbclient は指定された共有の各ディレクトリ一覧を取得しています。
出力の中からファイル属性情報を読み出し、
一覧の中の各ファイルがディレクトリなのか否かを判断します。
ディレクトリを選択すると選択されたディレクトリに対して再びディレクトリ一覧ブラウザを起動します。
ファイルを選択するとファイルのコピーを行ないます。
(3) の smbclient は SMB サーバから指定されたファイルをローカルにコピーしてきます。
先にコピー先のディレクトリを聞いて来ますので適当なディレクトリ名を入力すると、
ローカルの指定ディレクトリにファイルをコピーします。
コピー後は再びディレクトリ一覧ブラウザに戻ります。
ローカルマシン上で nmbd が稼動している場合は、 この nmbd に問い合わせればそのワークグループ内のブラウズリストが入手出来る筈なので、 それを使って (1) の更に一段前に SMB サーバ一覧ブラウザを構築することも可能になるとは思うのですが、 残念ながら現行の Samba の枠組の中ではそういう問い合わせに応じる機能は実装されてはいなさそうです。