SMB HOWTO
David Wood, dwood@plugged.net.au
v1.0, 10 August 1996
中野武雄 nakano@apm.seikei.ac.jp
v1.0j1, 24 September 1996
これは SMB HOWTO です。この文書は Linux で Session Message Block (SMB)
プロトコルを扱う方法について述べたものです。SMB プロトコルは、 NetBIOS
プロトコル、LanManager プロトコルとも呼ばれています。
______________________________________________________________________
目次
1. はじめに
2. 他の情報
3. インストール
4. デーモンを起動する
5. /etc/smb.conf の設定
6. Linux のドライブを Windows マシンから共有する
7. Windows のドライブを Linux マシンで共有する
8. Linux マシンのプリンタを Windows マシンから利用する
9. Linux マシンから Windows のプリンタを使う
10. 著作権
11. 謝辞
______________________________________________________________________
1. はじめに
これは SMB HOWTO です。この文書は Linux で Session Message Block (SMB)
プロトコルを扱う方法について述べたものです。SMB プロトコルは、 NetBIOS
プロトコル、LanManager プロトコルとも呼ばれています。
この文書は David Wood (dwood@plugged.net.au) が編集しています。追加情
報や修正、訂正についてのメールは、このアドレスまでお送りくだされば次回
のリリースに反映させます。
SMB プロトコルは Microsoft Windows 3.11、NT、95 でディスクやプリンタを
共有するために用いられます。Andrew Tridgell によって書かれた Samba ツ
ールセットを用いれば、Linux などの Unix マシンでも Windows のホストと
ディスクやプリンタを共有できます。
Samba を用いてできることは以下の 4 つです。
1. Linux ホストのドライブを Windows ホストで共有する。
2. Windows ホストのドライブを Linux ホストで共有する。
3. Linux ホストのプリンタを Windows ホストで共有する。
4. Windows ホストのプリンタを Linux ホストで共有する。
この文書は以上のケースをすべてカバーしています。
免責: この文書に記した方法やスクリプトは、著者を含めた何人かのグループ
の中ではうまく働いています。しかし環境が異なると、うまくいかない可能性
もあります。そのような場合は著者にメールで知らせていただければ、この文
書の発展に役立ちます。ただし著者は何の保証もしません。何を期待してたん
ですか?著者はただ助言をしているにすぎないのです...
2. 他の情報
この HOWTO 文書では、Linux マシンで SMB のファイルサービス、プリントサ
ービスを利用するための設定法について、基礎から説明しています。Samba は
複雑で高機能なシステムですので、この文書では Samba に関する情報すべて
を記述することはできませんし、またそのつもりもありません。
より多くの情報を知りたい人は以下の文献をみてください。
o Samba の配布パッケージに含まれるドキュメント。配布パッケージは
から取得できます。
o Linux Printing HOWTO
o Print2Win mini HOWTO
===訳注===
国内の Samba 公式ミラーサーバとしては、
などがあります。この翻訳を書いている
'96 9 月現在では、1.9.16p2 が最新のリリースバージョンのようです。
日本語の解説文書としては以下のようなものがあります。ただしこれらは
1.9.15p8 をベースに書いてありますので、1.9.16p2 では細かな部分が変わっ
ています。特に nmbd の扱いがだいぶ変わっているので、man nmbd しておく
ことを強くお勧めします。
o Unix Magazine '96 3 月号 『特集 PC UNIX』岡山聖彦、片山善章
o Unix User '96 10 月号〜 『プレイ・パーソナル Linux』真鍋敬士
o 『実例付き Samba の使い方』平野 聡
国内の Samba ドキュメントとしてはバイブル的存在と言えましょう。
o 佐藤文優さんの Samba Web ページ
smb.conf の翻訳などがあります。
ニュースでは、英語ですが comp.protocols.smb で Samba に関する議論がさ
れています。
==訳注終==
3. インストール
最新の Samba のソースは か
ら得られます。
Redhat を使っている人なら Samba を rpm 形式でインストールすることもで
きます。他の配布パッケージにも Samba のバイナリインストールが可能なも
のがあります。
===訳注===
日本語のファイル名を有効にしたい場合は、コンパイルの際に Makefile での
設定が必要になります。上記のようなバイナリパッケージで日本語ファイル名
が有効になっているかどうか、ご存知の方がいらっしゃいましたら訳者までお
知らせいただければ幸いです。
==訳注終==
Samba を利用するためには以下の 2 つのデーモンプログラムが必要です。こ
れらは通常 /usr/sbin にインストールされ、システム起動時にブートアップ
スクリプトで起動されるか、または inetd から実行されます。スクリプトの
例は、``デーモンを起動する'' の節にあげてあります。
smbd
SMB デーモンです。
nmbd
クライアントへ NetBIOS による名前解決機能を提供します。
以下の Samba プログラムは通常 /usr/bin にインストールされます(この場
所は選択可能です)。
smbclient
UNIX ホストのための SMB クライアントプログラム
smbprint
SMB ホストのプリンタを利用するためのスクリプト
smbprint.sysv
SVR4 用の smbprint
smbstatus
ローカルホストへの SMB 接続をリストするプログラム
smbrun
SMB ホストで必要なアプリケーションを実行させるための補助的な役割
をするスクリプトプログラム
さらに、この HOWTO 文書には print という名前のスクリプトが入っていま
す。これは smbprint スクリプトのフロントエンドで、印刷をより簡単にする
ものです。
Samba のパッケージをインストールするのは簡単です。上記の URL からソー
スを手に入れ、配布アーカイブの中の README ファイルを見てください。また
docs/INSTALL.txt にはインストール手順の詳細な解説が書いてあります。
インストールに続いて、デーモンを /usr/sbin へ、プログラムを /usr/bin
へ、man ページを /usr/local/man に置きましょう。
Samba のパッケージを作るとき、smbd のコンフィギュレーションファイルで
ある smb.conf の置き場所を Makefile の中で指定します。好きなところに置
くことができますが、通常は /etc/smb.conf が良いでしょう。ログファイル
とロックディレクトリについては以下のように設定しておくことをお勧めしま
す。
______________________________________________________________________
log file=/var/log/samba-log.%m
lock directory = /var/lock/samba
______________________________________________________________________
===訳注===
Samba パッケージのデフォルトの設定では、デーモンおよびプログラムは
/usr/local/samba/bin へ、また smb.conf などは /usr/local/samba/lib に
置かれます。
また log file と lock directory の設定は Makefile でもできます
が、smb.conf に書いておく方がドキュメント性が高くなるので良いと思いま
す。
==訳注終==
smb.conf をインストールします。Samba のプログラムをコンパイルしたディ
レクトリに行き、さらに example/simple ディレクトリに移動して README を
読んで下さい。続いてディレクトリにある smb.conf を /etc にコピーしま
す。ここでちょっと注意。 Redhat などの配布パッケージから Samba をイン
ストールした場合には、既に /etc に smb.conf があるかもしれません。この
場合は、このファイルから設定をはじめると良いでしょう。
% smb.conf を /etc に置きたくない場合には、好きな場所においてシンボ
リックリンクを /etc に作りましょう。
______________________________________________________________________
ln -s /path/to/smb.conf /etc/smb.conf
______________________________________________________________________
4. デーモンを起動する
SMB のデーモンは /usr/sbin/smbd と /usr/sbin/nmbd の 2 つです。
Samba のデーモンを実行するやりかたは 2 つあります。inetd から起動する
方法と、スタンドアローンのプロセスとして起動する方法です。専用のファイ
ルサーバとして用いる場合は inetd から起動する方が良いでしょう。そうす
れば何らかの理由でこれらのデーモンプロセスが死んでも、次のリクエストに
よって再実行されます。SMB サーバサービスを時々しか利用しない(システム
管理のときだけとか)ならば、/etc/rc.d/init.d スクリプトから実行すると
良いでしょう。必要なときだけ手動で実行しても良いでしょう。
===訳注===
スピードの点からは、デーモンプロセスの方がわずかながら有利という意見も
あります。また、訳者のホストで 3 ヶ月ほど Samba を使用した間、落ちたこ
とはありませんでした。
==訳注終==
inetd からデーモンを起動する場合は、以下の行を inetd の設定ファイル
/etc/inetd.conf に加えます。
______________________________________________________________________
# SAMBA NetBIOS services (for PC file and print sharing)
netbios-ssn stream tcp nowait root /usr/sbin/smbd smbd
netbios-ns dgram udp wait root /usr/sbin/nmbd nmbd
______________________________________________________________________
書き換えたら、以下のコマンドを実行して inetd をリスタートします。
______________________________________________________________________
kill -HUP
______________________________________________________________________
には inetd のプロセス ID を入れてください。ps コマンド
で確認するか、"cat /var/run/inetd.pid" などでもわかります。
デーモンをシステムの起動スクリプトから実行する場合は、以下の内容を
/etc/rc.d/init.d/smb として作製し、スクリプト中のコメントで指定されて
いるファイルへのシンボリックリンクを作ってください。
______________________________________________________________________
#!/bin/sh
#
# /etc/rc.d/init.d/smb - starts and stops SMB services.
#
# The following files should be synbolic links to this file:
# symlinks: /etc/rc.d/rc1.d/K35smb (Kills SMB services on shutdown)
# /etc/rc.d/rc3.d/S91smb (Starts SMB services in multiuser mode)
# /etc/rc.d/rc6.d/K35smb (Kills SMB services on reboot)
#
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0
# See how we were called.
case "$1" in
start)
echo -n "Starting SMB services: "
daemon smbd -D
daemon nmbd -D
echo
touch /var/lock/subsys/smb
;;
stop)
echo -n "Shutting down SMB services: "
killproc smbd
killproc nmbd
rm -f /var/lock/subsys/smb
echo ""
;;
*)
echo "Usage: smb {start|stop}"
exit 1
esac
______________________________________________________________________
===訳注===
Slackware の場合は、/etc/rc.d/rc.local に以下のような行を追加しておけ
ば良いでしょう。
______________________________________________________________________
if [ -f /usr/sbin/nmbd ]; then
echo "SAMBA servers"
/usr/sbin/smbd -D
/usr/sbin/nmbd -D
fi
______________________________________________________________________
==訳注終==
5. /etc/smb.conf の設定
Linux でも他の Unix 上でも、Samba の設定は /etc/smb.conf というファイ
ルにまとめて記されています。どのシステムリソースを公開するか、またそれ
らにどのような制限を科すかなどは、このファイルで設定します。
この節に続く 2 節では Linux のドライブやプリンタを Windows マシンから
共有する方法について述べます。この節で示す smb.conf は、できるだけ簡単
にこれらの機能を実現するように書いたものですので、あくまで導入的なもの
と考えてください。
この smb.conf の詳細が解らなくても心配する必要はありません。重要な概念
については後の節であらためて説明します。
smb.conf 中の各々のセクションは、セクションヘッダ([global]、[homes]、
[printers] 等)から始まります。
global セクションでは全てのセクションに共通な変数を指定します。
homes セクションを指定すると、リモートユーザは自分のホームディレクトリ
へアクセスできるようになります。つまり Samba ホストである Linux マシン
にアカウントを持っている人が Windows マシンで接続すると、彼ら個人個人
のホームディレクトリを利用できるようになります。このサービスを利用する
には Linux マシンにアカウントを持っていなければなりません。
ここに示した smb.conf の例では、リモートユーザが自分のホームディレクト
リにアクセスし、/tmp ディレクトリに書きこみできるようにしていま
す。Windows ユーザにこれらのリソースを見せるには、Linux のホストがロー
カルなネットワーク上になければなりません。Windows のファイルマネージャ
やエクスプローラを用いれば、これらのドライブをネットワークドライブとし
て接続できます。
この文書の以下の節では、他のリソースを共有させるための smb.conf ファイ
ルの書式についても述べています。参考にしてください。
______________________________________________________________________
; /etc/smb.conf
;
; Make sure and restart the server after making changes to this file, ex:
; /etc/rc.d/init.d/smb stop
; /etc/rc.d/init.d/smb start
[global]
; Uncomment this if you want a guest account
; guest account = nobody
log file = /var/log/samba-log.%m
lock directory = /var/lock/samba
share modes = yes
[homes]
comment = Home Directories
browseable = no
read only = no
create mode = 0750
[tmp]
comment = Temporary file space
path = /tmp
read only = no
public = yes
______________________________________________________________________
6. Linux のドライブを Windows マシンから共有する
上にあげた簡単な smb.conf からも解るように、Linux のドライブを Windows
のユーザが共有するのは簡単です。しかし Samba のシステムでは非常に多く
の項目をカスタマイズできます。以下にいくつか例を示します。
あるディレクトリを制限なしに公開するには、先程の節で挙げたsmb.conf の
tmp セクションをまねして、いくつかのパラメータを設定します。
______________________________________________________________________
[public]
comment = Public Stuff
path = /home/public
public = yes
writable = yes
printable = yes
______________________________________________________________________
このディレクトリの制限をちょっと変えて、読み出しはだれでも可能とし、書
き込みを staff グループのユーザに限るには、以下のようにします。
______________________________________________________________________
[public]
comment = Public Stuff
path = /home/public
public = yes
writable = yes
printable = no
write list = @staff
______________________________________________________________________
ドライブ共有に関する他の手法については、Samba 付属の文書や man ページ
を見てください。
===訳注===
Win 95 で作成したファイルで大文字小文字の区別をしたり、日本語を正しく
表示させるためには、global セクションに以下のエントリを追加しておくと
良いようです。
______________________________________________________________________
mangle case = no
case sensitive = no
default case = upper
preserve case = yes
short preserve case = yes
______________________________________________________________________
日本語を利用するには、コンパイル時に Makefile で
-DKANJI=\"euc\"
などと指定する必要があります。また 1.9.16p2 からは、smb.conf で
______________________________________________________________________
coding system = <コード系>
______________________________________________________________________
のように指定することが可能になり、また CAP と同時に使うための "cap" と
いう漢字コード系が追加されました。
なおコード系を unicode にしておくと、日本語 Windows 95 から Samba のド
ライブを接続した場合、新規フォルダの作成ができなくなるという不具合があ
るそうです。
==訳注終==
7. Windows のドライブを Linux マシンで共有する
Samba の配布パッケージには、Unix マシンのための SMB クライアントプログ
ラムが含まれています。このプログラムは ftp のようなコマンド指向のイン
ターフェースを持っています。このプログラムを使えば、Windows のサーバ
と、 Linux のクライアントとのあいだで、ファイルのやり取りができます。
===訳注===
2.0 以上などの最近のカーネルでは smbfs というファイルシステムがあ
り、NT などのネットワークドライブを直接マウントできるようです。詳細
は、カーネルディレクトリ下 Documentation/filesystems/smbfs.txt を見て
下さい。
==訳注終==
あるホストでどんな共有サービスが利用出来るかを調べるためには、以下のよ
うなコマンドを実行します。
______________________________________________________________________
/usr/sbin/smbclient -L host
______________________________________________________________________
host には調べたいホストの名前を入れます。このコマンドを実行すると、サ
ービス名のリストが得られます。サービス名とは、あなたがこのホストで利用
できるドライブやプリンタの名前です。もし SMB サーバに何らかのセキュリ
ティ制限がかかっているとパスワードを聞かれますので、guest アカウントの
パスワードか、そのホストでのあなたの個人アカウントのパスワードを入れて
下さい。
実行例を示します。
______________________________________________________________________
smbclient -L zimmerman
______________________________________________________________________
実行結果は以下のようになるでしょう。
______________________________________________________________________
Server time is Sat Aug 10 15:58:27 1996
Timezone is UTC+10.0
Password:
Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
Server=[ZIMMERMAN] User=[] Workgroup=[WORKGROUP] Domain=[]
Sharename Type Comment
--------- ---- -------
ADMIN$ Disk Remote Admin
public Disk Public
C$ Disk Default share
IPC$ IPC Remote IPC
OReilly Printer OReilly
print$ Disk Printer Drivers
This machine has a browse list:
Server Comment
--------- -------
HOPPER Samba 1.9.15p8
KERNIGAN Samba 1.9.15p8
LOVELACE Samba 1.9.15p8
RITCHIE Samba 1.9.15p8
ZIMMERMAN
______________________________________________________________________
ブラウズリスト(browse list)は、ネットワーク上の他の SMB サーバの共有
リソースを示したものです。
クライアントとして利用するには以下のように実行します。
______________________________________________________________________
/usr/sbin/smbclient service
______________________________________________________________________
service にはホスト名と共有名を指定します。ホスト zimmerman において
public という名前で公開されているディレクトリを利用するために
は、service は \\zimmerman\public となります。シェルのプロンプトからこ
のコマンドを利用する場合は、バックスラッシュをエスケープしないといけま
せんから、結局次のように入力する必要があります。
______________________________________________________________________
/usr/sbin/smbclient \\\\zimmerman\\public mypasswd
______________________________________________________________________
mypassword には、あなたの パスワードをそのまま書いてください。
===訳注===
以下は松本@京大人間環境さんによるもうちょっと簡単な入力方法です。
______________________________________________________________________
/usr/sbin/smbclient '\\zimmerman\public' mypasswd
______________________________________________________________________
==訳注終==
以下のような smbclient のプロンプトが出てきます。
______________________________________________________________________
Server time is Sat Aug 10 15:58:44 1996
Timezone is UTC+10.0
Domain=[WORKGROUP] OS=[Windows NT 3.51] Server=[NT LAN Manager 3.51]
smb: \>
______________________________________________________________________
h と打てば、smbclient のヘルプが得られます。
______________________________________________________________________
smb: \> h
ls dir lcd cd pwd
get mget put mput rename
more mask del rm mkdir
md rmdir rd prompt recurse
translate lowercase print printmode queue
cancel stat quit q exit
newer archive tar blocksize tarmode
setmode help ? !
smb: \>
______________________________________________________________________
ftp を使える人なら、man ページを見るまでもなく smbclient が使えるよう
になるでしょう。
8. Linux マシンのプリンタを Windows マシンから利用する
Linux のプリンタを Windows から利用するには、Linux 上でプリンタがちゃ
んと動作するように正しく設定されている必要があります。Linux でのプリン
トができていれば SMB での共有は簡単です。
ローカルプリンタの設定については Printing HOWTO をみてください。
筆者自身は Windows NT に接続されているプリンタを使っているので、この節
に書いてあることは絶対に正しいとは限りません。助言程度に受けとめておい
てください。もし具体的な使用経験を持っている方がいらっしゃいましたら、
どうぞ dwood@plugged.net.au まで知らせてください。そうすればこの章の内
容を完成できます。
smb.conf にプリンタの設定を加えます。
______________________________________________________________________
[global]
printing = bsd
printcap name = /etc/printcap
load printers = yes
log file = /var/log/samba-log.%m
lock directory = /var/lock/samba
[printers]
comment = All Printers
security = server
path = /var/spool/lpd/lp
browseable = no
printable = yes
public = yes
writable = no
create mode = 0700
[ljet]
security = server
path = /var/spool/lpd/lp
printer name = lp
writable = yes
public = yes
printable = yes
print command = lpr -r -h -P %p %s
______________________________________________________________________
プリンタのセクションにおける path には、/etc/printcap で設定したスプー
ルディレクトリと同じディレクトリを指定してください。
注意: Samba を使って Unix マシンのプリンタを Windows NT マシンから共有
させる際には問題点がいくつかあります。そのうちの一つは、NT からは共有
プリンタが正しく見えないというものです。この問題を解決するには Samba
配布パッケージの docs/WinNT.txt ファイルを参照して下さい。パスワードに
関する問題もあります。こちらの方は同ファイルを見ても、いらいらするだけ
で解決にはなりません...
===訳注===
訳者は Linux につながっている Epson MJ-700V2C を Samba で公開し
Windows 95 から使っていますので、その設定内容を以下に記します。ただ
し、公開先はプライベートアドレスのついたネットワークなので、基本的にセ
キュリティのことは考えていません。
まず smb.conf です。
______________________________________________________________________
[global]
lock directory = /var/locks/samba
workgroup = WORKGROUP
browseable = yes
allow hosts = 192.168.111.
printing = bsd
load printers = no
printcap name = /etc/printcap
password level = 8
create mode = 0750
mangle case = no
case sensitive = no
default case = upper
preserve case = yes
short preserve case = yes
[lp]
comment = MJ-700V2C
printer name = lp
path = /var/tmp
printable = yes
writable = yes
create mode = 0700
______________________________________________________________________
/etc/printcap です。
______________________________________________________________________
lp:\
:lp=/dev/lp1:\
:sd=/var/spool/lpd/lp:\
:lf=/var/spool/lpd/lp/errs:\
:if=/var/spool/lpd/lp/incat:\
:mx#0:\
:sh:\
:sf:
______________________________________________________________________
インプットフィルタの /var/spool/lpd/lp/incat です。
______________________________________________________________________
#!/bin/sh
/bin/cat
exit 0
______________________________________________________________________
Windows 95 からは、ネットワークドライブを選択した後 MJ-700V2C のドライ
バを手で選んでインストールする必要があります。
==訳注終==
9. Linux マシンから Windows のプリンタを使う
Windows マシン上のプリンタを共有するためには以下の作業が必要です。
1. /etc/printcap に正しいエントリが必要で、それらはローカルなディレク
トリ構造に準じたものである必要があります(スプールディレクトリの設
定など)。
2. /usr/bin/smbprint スクリプトが必要です。これは Samba のソースパッケ
ージに付いてきますが、Samba のバイナリ配布パッケージには付いてこな
いかもしれません。後でオリジナルを少々修正したものを載せます。
3. ASCII ファイルを Postscript 形式に変換する必要がある場合には、
nenscript などの Postscript コンバータを準備する必要があります。
nenscript は通常は /usr/bin にインストールされています。
4. Samba を利用した印刷を容易にしてくれるようなフロントエンドが欲しけ
れば、以下に記した簡単な perl スクリプトを試して下さい。ASCII、
Postscript、created Postscript が扱えるようになっています。
以下に記すのは、Windows NT プリンタに接続された HP 5MP プリンタを利用
するための /etc/printcap へのエントリです。それぞれの内容は以下の通り
です。
cm コメント
lp 出力に使うデバイス名
sd このプリンタのためのスプールディレクトリ
af アカウントファイル
mx 最大のファイルサイズ(0 にすれば無制限になります)
if 入力に用いられるフィルタ(またはスクリプト)
さらに情報が必要なら、Printing HOWTO や printcap の man ページを見て下
さい。
______________________________________________________________________
# /etc/printcap
#
# //zimmerman/oreilly via smbprint
#
lp:\
:cm=HP 5MP Postscript OReilly on zimmerman:\
:lp=/dev/lp1:\
:sd=/var/spool/lpd/lp:\
:af=/var/spool/lpd/lp/acct:\
:mx#0:\
:if=/usr/bin/smbprint:
______________________________________________________________________
スプールディレクトリとアカウントファイルが存在しており、書き込み可能で
あることを確認しておいて下さい。また printcap の if 行に、以下に記す
smbprint スクリプトへの正しいパスが設定されていること、 lp 行に /dev
ディレクトリにある正しいデバイスが設定されていることも確認して下さい。
次は smbprint です。これは通常 /usr/bin に置かれており、 Samba を作っ
た Andrew Tridgell 本人によって書かれたものです(筆者の知らない Samba
の共作者が他にいらっしゃったらすみません)。これは Samba のソースパッ
ケージに入っていますが、バイナリ配布の場合には無いかも知れませんので、
以下に私が少々手を加えたものを示しておきます。
以下に記したスクリプトを注意深く見て下さい。これはオリジナルを修正した
もので、多少使いやすくなっていると思います。
______________________________________________________________________
#!/bin/sh -x
# This script is an input filter for printcap printing on a unix machine. It
# uses the smbclient program to print the file to the specified smb-based
# server and service.
# For example you could have a printcap entry like this
#
# smb:lp=/dev/null:sd=/usr/spool/smb:sh:if=/usr/local/samba/smbprint
#
# which would create a unix printer called "smb" that will print via this
# script. You will need to create the spool directory /usr/spool/smb with
# appropriate permissions and ownerships for your system.
# Set these to the server and service you wish to print to
# In this example I have a WfWg PC called "lapland" that has a printer
# exported called "printer" with no password.
#
# Script further altered by hamiltom@ecnz.co.nz (Michael Hamilton)
# so that the server, service, and password can be read from
# a /usr/var/spool/lpd/PRINTNAME/.config file.
#
# In order for this to work the /etc/printcap entry must include an
# accounting file (af=...):
#
# cdcolour:\
# :cm=CD IBM Colorjet on 6th:\
# :sd=/var/spool/lpd/cdcolour:\
# :af=/var/spool/lpd/cdcolour/acct:\
# :if=/usr/local/etc/smbprint:\
# :mx=0:\
# :lp=/dev/null:
#
# The /usr/var/spool/lpd/PRINTNAME/.config file should contain:
# server=PC_SERVER
# service=PR_SHARENAME
# password="password"
#
# E.g.
# server=PAULS_PC
# service=CJET_371
# password=""
#
# Debugging log file, change to /dev/null if you like.
#
logfile=/tmp/smb-print.log
# logfile=/dev/null
#
# The last parameter to the filter is the accounting file name.
#
spool_dir=/var/spool/lpd/lp
config_file=$spool_dir/.config
# Should read the following variables set in the config file:
# server
# service
# password
# user
eval `cat $config_file`
#
# Some debugging help, change the >> to > if you want to same space.
#
echo "server $server, service $service" >> $logfile
(
# NOTE You may wish to add the line `echo translate' if you want automatic
# CR/LF translation when printing.
echo translate
echo "print -"
cat
) | /usr/bin/smbclient "\\\\$server\\$service" $password -U $user -N -P >> $log
file
______________________________________________________________________
ほとんどの Linux パッケージには、ASCII 文書を Postscript にする
nenscript コマンドが含まれています。以下の perl スクリプトは、
smbprint を使って印刷する際に、よりシンプルなインターフェースを提供す
るものです。
______________________________________________________________________
Usage: print [-a|c|p]
-a prints as ASCII
-c prints formatted as source code
-p prints as Postscript
If no switch is given, print attempts to
guess the file type and print appropriately.
______________________________________________________________________
smbprint を使って ASCII ファイルを印刷すると、長い行は改行されてしまい
ます。このスクリプトでは、可能な限り単語の途中ではなく、空白で改行する
ようにしています。
ソースコードのフォーマットには nenscript を用いています。ASCII ファイ
ルは 2 段組みに整形され、ヘッダ(日付、ファイル名など)がつきます。こ
のスクリプトを雛形にして、他の整形方法を用いることもできるでしょう。
Postscript の文書はすでに整形されているものとみなして、そのまま通すよ
うになっています。
______________________________________________________________________
#!/usr/bin/perl
# Script: print
# Authors: Brad Marshall, David Wood
# Plugged In Communications
# Date: 960808
#
# Script to print to oreilly which is currently on zimmerman
# Purpose: Takes files of various types as arguments and
# processes them appropriately for piping to a Samba print script.
#
# Currently supported file types:
#
# ASCII - ensures that lines longer than $line_length characters wrap on
# whitespace.
# Postscript - Takes no action.
# Code - Formats in Postscript (using nenscript) to display
# properly (landscape, font, etc).
#
# Set the maximum allowable length for each line of ASCII text.
$line_length = 76;
# Set the path and name of the Samba print script
$print_prog = "/usr/bin/smbprint";
# Set the path and name to nenscript (the ASCII-->Postscript converter)
$nenscript = "/usr/bin/nenscript";
unless ( -f $print_prog ) {
die "Can't find $print_prog!";
}
unless ( -f $nenscript ) {
die "Can't find $nenscript!";
}
&ParseCmdLine(@ARGV);
# DBG
print "filetype is $filetype\n";
if ($filetype eq "ASCII") {
&wrap($line_length);
} elsif ($filetype eq "code") {
&codeformat;
} elsif ($filetype eq "ps") {
&createarray;
} else {
print "Sorry..no known file type.\n";
exit 0;
}
# Pipe the array to smbprint
open(PRINTER, "|$print_prog") || die "Can't open $print_prog: $!\n";
foreach $line (@newlines) {
print PRINTER $line;
}
# Send an extra linefeed in case a file has an incomplete last line.
print PRINTER "\n";
close(PRINTER);
print "Completed\n";
exit 0;
# --------------------------------------------------- #
# Everything below here is a subroutine #
# --------------------------------------------------- #
sub ParseCmdLine {
# Parses the command line, finding out what file type the file is
# Gets $arg and $file to be the arguments (if the exists)
# and the filename
if ($#_ < 0) {
&usage;
}
# DBG
# foreach $element (@_) {
# print "*$element* \n";
# }
$arg = shift(@_);
if ($arg =~ /\-./) {
$cmd = $arg;
# DBG
# print "\$cmd found.\n";
$file = shift(@_);
} else {
$file = $arg;
}
# Defining the file type
unless ($cmd) {
# We have no arguments
if ($file =~ /\.ps$/) {
$filetype = "ps";
} elsif ($file =~ /\.java$|\.c$|\.h$|\.pl$|\.sh$|\.csh$|\.m4$|\.inc$|\.html$|\.htm$/) {
$filetype = "code";
} else {
$filetype = "ASCII";
}
# Process $file for what type is it and return $filetype
} else {
# We have what type it is in $arg
if ($cmd =~ /^-p$/) {
$filetype = "ps";
} elsif ($cmd =~ /^-c$/) {
$filetype = "code";
} elsif ($cmd =~ /^-a$/) {
$filetype = "ASCII"
}
}
}
sub usage {
print "
Usage: print [-a|c|p]
-a prints as ASCII
-c prints formatted as source code
-p prints as Postscript
If no switch is given, print attempts to
guess the file type and print appropriately.\n
";
exit(0);
}
sub wrap {
# Create an array of file lines, where each line is < the
# number of characters specified, and wrapped only on whitespace
# Get the number of characters to limit the line to.
$limit = pop(@_);
# DBG
#print "Entering subroutine wrap\n";
#print "The line length limit is $limit\n";
# Read in the file, parse and put into an array.
open(FILE, "<$file") || die "Can't open $file: $!\n";
while() {
$line = $_;
# DBG
#print "The line is:\n$line\n";
# Wrap the line if it is over the limit.
while ( length($line) > $limit ) {
# DBG
#print "Wrapping...";
# Get the first $limit +1 characters.
$part = substr($line,0,$limit +1);
# DBG
#print "The partial line is:\n$part\n";
# Check to see if the last character is a space.
$last_char = substr($part,-1, 1);
if ( " " eq $last_char ) {
# If it is, print the rest.
# DBG
#print "The last character was a space\n";
substr($line,0,$limit + 1) = "";
substr($part,-1,1) = "";
push(@newlines,"$part\n");
} else {
# If it is not, find the last space in the
# sub-line and print up to there.
# DBG
#print "The last character was not a space\n";
# Remove the character past $limit
substr($part,-1,1) = "";
# Reverse the line to make it easy to find
# the last space.
$revpart = reverse($part);
$index = index($revpart," ");
if ( $index > 0 ) {
substr($line,0,$limit-$index) = "";
push(@newlines,substr($part,0,$limit-$index)
. "\n");
} else {
# There was no space in the line, so
# print it up to $limit.
substr($line,0,$limit) = "";
push(@newlines,substr($part,0,$limit)
. "\n");
}
}
}
push(@newlines,$line);
}
close(FILE);
}
sub codeformat {
# Call subroutine wrap then filter through nenscript
&wrap($line_length);
# Pipe the results through nenscript to create a Postscript
# file that adheres to some decent format for printing
# source code (landscape, Courier font, line numbers).
# Print this to a temporary file first.
$tmpfile = "/tmp/nenscript$$";
open(FILE, "|$nenscript -2G -i$file -N -p$tmpfile -r") ||
die "Can't open nenscript: $!\n";
foreach $line (@newlines) {
print FILE $line;
}
close(FILE);
# Read the temporary file back into an array so it can be
# passed to the Samba print script.
@newlines = ("");
open(FILE, "<$tmpfile") || die "Can't open $file: $!\n";
while() {
push(@newlines,$_);
}
close(FILE);
system("rm $tmpfile");
}
sub createarray {
# Create the array for postscript
open(FILE, "<$file") || die "Can't open $file: $!\n";
while() {
push(@newlines,$_);
}
close(FILE);
}
______________________________________________________________________
===訳注===
nenscrpt は日本語を通しませんが、JE には psconv という日本語に対応した
コマンドが入っています。他にも a2ps、ps2ascii、 ps2txt、toPS など様々
なものがネットワークから入手可能です。
なお、訳者はこの章のスクリプトをテストできる環境がありませんので、原文
にあったスクリプトをそのまま載せておきました。改造して日本語を通すこと
に成功した方は、ご連絡下されば幸いです。
==訳注終==
10. 著作権
この HOWTO 文書の著作権は 1996 年以降 David Wood にあるものとします。
この節の宣言を含むすべての文書が変更されない限りにおいて、あらゆる形式
へのこの文書の複製、およびその再配布を許可します。
11. 謝辞
もしメールで御意見をいただければ、次の版のリリースの際に、この節でお名
前を挙げて感謝したいと思います。
===訳注===
日本語への翻訳に当たっては、
岡本一幸さん ikko-@pacific.rim.or.jp
桑村 潤さん juk@rccm.co.jp
松本庄司さん shom@i.h.kyoto-u.ac.jp
箕浦逸史さん minoura@biol.s.u-tokyo.ac.jp
に誤訳の指摘や有益なコメントをいただきました。
==訳注終==