<!doctype linuxdoctr system>

<!-- This is the SMB HowTo or Linux and other UNIXs -->

<article>

<!-- Title information -->

<title>SMB HOWTO
<author>David Wood,
<htmlurl url="mailto:dwood@plugged.net.au" name="dwood@plugged.net.au">
<date>v1.0, 10 August 1996
<trans>中野武雄
<htmlurl url="mailto:nakano@apm.seikei.ac.jp" name="nakano@apm.seikei.ac.jp">
<tdate>v1.0j1, 24 September 1996

<abstract>

これは　SMB HOWTO です。この文書は Linux で Session Message Block
(SMB) プロトコルを扱う方法について述べたものです。SMB プロトコルは、
NetBIOS プロトコル、LanManager プロトコルとも呼ばれています。

</abstract>

<p>
<bf>注意: この文書はかなり以前に書かれたものなので、
いまどきの Linux 環境にはあてはまらない箇所があります。
(JF Project)</bf>
</p>

<!-- Table of contents -->
<toc>

<!-- Begin the document -->

<sect>はじめに
<p>

これは　SMB HOWTO です。この文書は Linux で Session Message Block
(SMB) プロトコルを扱う方法について述べたものです。SMB プロトコルは、
NetBIOS プロトコル、LanManager プロトコルとも呼ばれています。

この文書は David Wood
(<htmlurl url="mailto:dwood@plugged.net.au" name="dwood@plugged.net.au">)
が編集しています。追加情報や修正、訂正についてのメールは、このアドレス
までお送りくだされば次回のリリースに反映させます。

SMB プロトコルは Microsoft Windows 3.11、NT、95 でディスクやプリン
タを共有するために用いられます。Andrew Tridgell によって書かれた Samba
ツールセットを用いれば、Linux などの Unix マシンでも Windows のホスト
とディスクやプリンタを共有できます。

Samba を用いてできることは以下の 4 つです。

<enum>
<item>Linux ホストのドライブを Windows ホストで共有する。
<item>Windows ホストのドライブを Linux ホストで共有する。
<item>Linux ホストのプリンタを Windows ホストで共有する。
<item>Windows ホストのプリンタを Linux ホストで共有する。
</enum>

この文書は以上のケースをすべてカバーしています。

免責: この文書に記した方法やスクリプトは、著者を含めた何人かのグループ
の中ではうまく働いています。しかし環境が異なると、うまくいかない可能
性もあります。そのような場合は著者にメールで知らせていただければ、この
文書の発展に役立ちます。ただし著者は何の保証もしません。何を期待して
たんですか？著者はただ助言をしているにすぎないのです...

<sect> 他の情報
<p>

この HOWTO 文書では、Linux マシンで SMB のファイルサービス、プリントサー
ビスを利用するための設定法について、基礎から説明しています。Samba は複
雑で高機能なシステムですので、この文書では Samba に関する情報すべてを
記述することはできませんし、またそのつもりもありません。

より多くの情報を知りたい人は以下の文献をみてください。

<itemize>
<item>Samba の配布パッケージに含まれるドキュメント。配布パッケージは 
<url url="ftp://nimbus.anu.edu.au/pub/tridge/samba/">
から取得できます。

<item>Linux Printing HOWTO

<item>Print2Win mini HOWTO

</itemize>

===訳注===

国内の Samba 公式ミラーサーバとしては、
<url url="ftp://ring.aist.go.jp/archives/net/samba/">
<url url="ftp://ring.asahi-net.or.jp/archives/net/samba/">
などがあります。この翻訳を書いている '96 9 月現在では、1.9.16p2 が最新
のリリースバージョンのようです。

日本語の解説文書としては以下のようなものがあります。ただしこれらは 
1.9.15p8 をベースに書いてありますので、1.9.16p2 では細かな部分が変わっ
ています。特に <tt/nmbd/ の扱いがだいぶ変わっているので、<tt/man nmbd/ 
しておくことを強くお勧めします。

<itemize>
<item>Unix Magazine '96 3 月号 『特集 PC UNIX』岡山聖彦、片山善章

<item>Unix User '96 10 月号〜 『プレイ・パーソナル Linux』真鍋敬士

<item>『実例付き Samba の使い方』平野 聡
<url url="ftp://etlport.etl.go.jp/pub/windows/knowhow/samba.txt"><newline>
国内の Samba ドキュメントとしてはバイブル的存在と言えましょう。

<item>佐藤文優さんの Samba Web ページ
<htmlurl url="http://www.yk.rim.or.jp/~fumiya/Samba/"><newline>
<tt/smb.conf/ の翻訳などがあります。

</itemize>

ニュースでは、英語ですが <tt/comp.protocols.smb/ で Samba に関する議論
がされています。

==訳注終==

<sect>インストール
<p>

最新の Samba のソースは
<url url="ftp://nimbus.anu.edu.au/pub/tridge/samba/">
から得られます。

Redhat を使っている人なら Samba を rpm 形式でインストールすることもで
きます。他の配布パッケージにも Samba のバイナリインストールが可能なも
のがあります。

===訳注===

日本語のファイル名を有効にしたい場合は、コンパイルの際に <tt/Makefile/
での設定が必要になります。上記のようなバイナリパッケージで日本語ファイ
ル名が有効になっているかどうか、ご存知の方がいらっしゃいましたら訳者ま
でお知らせいただければ幸いです。

==訳注終==

Samba を利用するためには以下の 2 つのデーモンプログラムが必要です。
これらは通常 <tt>/usr/sbin</tt> にインストールされ、システム起動時にブー
トアップスクリプトで起動されるか、または <tt/inetd/ から実行されます。
スクリプトの例は、<ref id="sec-daemons" name="デーモンを起動する"> 
の節にあげてあります。

<descrip>
<tag/smbd/ SMB デーモンです。
<tag/nmbd/ クライアントへ NetBIOS による名前解決機能を提供します。
</descrip>

以下の Samba プログラムは通常 <tt>/usr/bin</tt> にインストールされます
（この場所は選択可能です）。

<descrip>
<tag/smbclient/ UNIX ホストのための SMB クライアントプログラム
<tag/smbprint/ SMB ホストのプリンタを利用するためのスクリプト
<tag/smbprint.sysv/ SVR4 用の smbprint
<tag/smbstatus/ ローカルホストへの SMB 接続をリストするプログラム
<tag/smbrun/ SMB ホストで必要なアプリケーションを実行させるための補助
的な役割をするスクリプトプログラム
</descrip>

さらに、この HOWTO 文書には <tt/print/ という名前のスクリプトが入って
います。これは <tt/smbprint/ スクリプトのフロントエンドで、印刷をより
簡単にするものです。

Samba のパッケージをインストールするのは簡単です。上記の URL からソー
スを手に入れ、配布アーカイブの中の README ファイルを見てください。また 
<tt>docs/INSTALL.txt</tt> にはインストール手順の詳細な解説が書いてあります。

インストールに続いて、デーモンを <tt>/usr/sbin</tt> へ、プログラムを 
<tt>/usr/bin</tt> へ、man ページを <tt>/usr/local/man</tt> に置きましょ
う。

Samba のパッケージを作るとき、<tt/smbd/ のコンフィギュレーションファイ
ルである <tt/smb.conf/ の置き場所を <tt/Makefile/ の中で指定します。好
きなところに置くことができますが、通常は <tt>/etc/smb.conf</tt> が良い
でしょう。ログファイルとロックディレクトリについては以下のように設定し
ておくことをお勧めします。

<code>
   log file=/var/log/samba-log.%m
   lock directory = /var/lock/samba
</code>

===訳注===

Samba パッケージのデフォルトの設定では、デーモンおよびプログラムは 
<tt>/usr/local/samba/bin</tt> へ、また <tt>smb.conf</tt> などは 
<tt>/usr/local/samba/lib</tt> に置かれます。

また <tt>log file</tt> と <tt>lock directory</tt> の設定は 
<tt/Makefile/ でもできますが、<tt/smb.conf/ に書いておく方がドキュメン
ト性が高くなるので良いと思います。

==訳注終==

<tt/smb.conf/ をインストールします。Samba のプログラムをコンパイルした
ディレクトリに行き、さらに <tt>example/simple</tt> ディレクトリに移動
して <tt/README/ を読んで下さい。続いてディレクトリにある 
<tt/smb.conf/ を <tt>/etc</tt> にコピーします。ここでちょっと<em/注意/。
Redhat などの配布パッケージから Samba をインストールした場合には、既に
<tt>/etc</tt> に <tt/smb.conf/ があるかもしれません。この場合は、この
ファイルから設定をはじめると良いでしょう。

	%
	<tt/smb.conf/ を <tt>/etc</tt> に置きたくない場合には、好きな場所にお
いてシンボリックリンクを <tt>/etc</tt> に作りましょう。

<code>
    ln -s /path/to/smb.conf /etc/smb.conf
</code>

<sect>デーモンを起動する<label id="sec-daemons">
<p>

SMB のデーモンは <tt>/usr/sbin/smbd</tt> と <tt>/usr/sbin/nmbd</tt> の 
2 つです。

Samba のデーモンを実行するやりかたは 2 つあります。<tt/inetd/ から起動
する方法と、スタンドアローンのプロセスとして起動する方法です。専用のファ
イルサーバとして用いる場合は <tt/inetd/ から起動する方が良いでしょう。
そうすれば何らかの理由でこれらのデーモンプロセスが死んでも、次のリクエ
ストによって再実行されます。SMB サーバサービスを時々しか利用しない（シ
ステム管理のときだけとか）ならば、<tt>/etc/rc.d/init.d</tt> スクリプト
から実行すると良いでしょう。必要なときだけ手動で実行しても良いでしょう。

===訳注===

スピードの点からは、デーモンプロセスの方がわずかながら有利という意見も
あります。また、訳者のホストで 3 ヶ月ほど Samba を使用した間、落ちたこ
とはありませんでした。

==訳注終==

<tt/inetd/ からデーモンを起動する場合は、以下の行を <tt/inetd/ の設定
ファイル <tt>/etc/inetd.conf</tt> に加えます。

<code>
# 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
</code>

書き換えたら、以下のコマンドを実行して <tt/inetd/ をリスタートします。

<code>
    kill -HUP <pid of inetd>
</code>

<tt>&lt;pid of inetd&gt;</tt> には <tt/inetd/ のプロセス ID を入れてく
ださい。<tt/ps/ コマンドで確認するか、<tt>&dquot;cat
/var/run/inetd.pid&dquot;</tt> などでもわかります。


デーモンをシステムの起動スクリプトから実行する場合は、以下の内容を 
<tt>/etc/rc.d/init.d/smb</tt> として作製し、スクリプト中のコメントで指
定されているファイルへのシンボリックリンクを作ってください。

<code>
#!/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" ] &ero;&ero; 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
</code>

===訳注===

Slackware の場合は、<tt>/etc/rc.d/rc.local</tt> に以下のような行を追加
しておけば良いでしょう。
<code>
if [ -f /usr/sbin/nmbd ]; then
  echo "SAMBA servers"
  /usr/sbin/smbd -D
  /usr/sbin/nmbd -D
fi
</code>

==訳注終==

<sect> /etc/smb.conf の設定
<p>

Linux でも他の Unix 上でも、Samba の設定は <tt>/etc/smb.conf</tt> とい
うファイルにまとめて記されています。どのシステムリソースを公開するか、
またそれらにどのような制限を科すかなどは、このファイルで設定します。

この節に続く 2 節では Linux のドライブやプリンタを Windows マシンから
共有する方法について述べます。この節で示す <tt/smb.conf/ は、できるだ
け簡単にこれらの機能を実現するように書いたものですので、あくまで導入的
なものと考えてください。

この <tt/smb.conf/ の詳細が解らなくても心配する必要はありません。重要
な概念については後の節であらためて説明します。

<tt/smb.conf/ 中の各々のセクションは、セクションヘッダ
（<tt>&lsqb;global&rsqb;</tt>、<tt>&lsqb;homes&rsqb;</tt>、
<tt>&lsqb;printers&rsqb;</tt> 等）から始まります。

<tt/global/ セクションでは全てのセクションに共通な変数を指定します。

<tt/homes/ セクションを指定すると、リモートユーザは自分のホームディレ
クトリへアクセスできるようになります。つまり Samba ホストである Linux 
マシンにアカウントを持っている人が Windows マシンで接続すると、彼ら個
人個人のホームディレクトリを利用できるようになります。このサービスを利
用するには Linux マシンにアカウントを持っていなければなりません。

ここに示した <tt/smb.conf/ の例では、リモートユーザが自分のホームディ
レクトリにアクセスし、<tt>/tmp</tt> ディレクトリに書きこみできるように
しています。Windows ユーザにこれらのリソースを見せるには、Linux のホス
トがローカルなネットワーク上になければなりません。Windows のファイルマ
ネージャやエクスプローラを用いれば、これらのドライブをネットワークドラ
イブとして接続できます。

この文書の以下の節では、他のリソースを共有させるための <tt/smb.conf/ 
ファイルの書式についても述べています。参考にしてください。

<code>
; /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
</code>

<sect>Linux のドライブを Windows マシンから共有する
<p>

上にあげた簡単な <tt/smb.conf/ からも解るように、Linux のドライブを 
Windows のユーザが共有するのは簡単です。しかし Samba のシステムでは非
常に多くの項目をカスタマイズできます。以下にいくつか例を示します。

あるディレクトリを制限なしに公開するには、先程の節で挙げた<tt/
smb.conf/ の <tt/tmp/ セクションをまねして、いくつかのパラメータを設定
します。

<code>
[public]
   comment = Public Stuff
   path = /home/public
   public = yes
   writable = yes
   printable = yes
</code>

このディレクトリの制限をちょっと変えて、読み出しはだれでも可能とし、書
き込みを <tt/staff/ グループのユーザに限るには、以下のようにします。

<code>
[public]
   comment = Public Stuff
   path = /home/public
   public = yes
   writable = yes
   printable = no
   write list = @staff
</code>

ドライブ共有に関する他の手法については、Samba 付属の文書や man ページ
を見てください。

===訳注===

Win 95 で作成したファイルで大文字小文字の区別をしたり、日本語を正しく
表示させるためには、<tt/global/ セクションに以下のエントリを追加してお
くと良いようです。

<code>
   mangle case = no
   case sensitive = no
   default case = upper
   preserve case = yes
   short preserve case = yes
</code>

日本語を利用するには、コンパイル時に <tt/Makefile/ で
<tscreen><verb>
	-DKANJI=\"euc\"
</verb></tscreen>
などと指定する必要があります。また 1.9.16p2 からは、<tt/smb.conf/ で
<code>
   coding system = <コード系>
</code>
のように指定することが可能になり、また CAP と同時に使うための 
<tt>&dquot;cap&dquot;</tt> という漢字コード系が追加されました。

なおコード系を unicode にしておくと、日本語 Windows 95 から Samba のド
ライブを接続した場合、新規フォルダの作成ができなくなるという不具合があ
るそうです。

==訳注終==

<sect>Windows のドライブを Linux マシンで共有する
<p>

Samba の配布パッケージには、Unix マシンのための SMB クライアントプログ
ラムが含まれています。このプログラムは ftp のようなコマンド指向のイン
ターフェースを持っています。このプログラムを使えば、Windows のサーバと、
Linux のクライアントとのあいだで、ファイルのやり取りができます。

===訳注===

2.0 以上などの最近のカーネルでは <tt/smbfs/ というファイルシステムがあ
り、NT などのネットワークドライブを直接マウントできるようです。詳細は、
カーネルディレクトリ下 <tt>Documentation/filesystems/smbfs.txt</tt> を
見て下さい。

==訳注終==

あるホストでどんな共有サービスが利用出来るかを調べるためには、以下の
ようなコマンドを実行します。

<code>
    /usr/sbin/smbclient -L host
</code>

<tt/host/ には調べたいホストの名前を入れます。このコマンドを実行すると、
サービス名のリストが得られます。サービス名とは、あなたがこのホストで利
用できるドライブやプリンタの名前です。もし SMB サーバに何らかのセキュ
リティ制限がかかっているとパスワードを聞かれますので、<tt/guest/ アカ
ウントのパスワードか、そのホストでのあなたの個人アカウントのパスワード
を入れて下さい。

実行例を示します。

<code>
    smbclient -L zimmerman
</code>

実行結果は以下のようになるでしょう。

<code>
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            
</code>

ブラウズリスト（browse list）は、ネットワーク上の他の SMB サーバの共有
リソースを示したものです。

クライアントとして利用するには以下のように実行します。

<code>
    /usr/sbin/smbclient service <password>
</code>

<tt/service/ にはホスト名と共有名を指定します。ホスト <tt/zimmerman/ 
において <tt/public/ という名前で公開されているディレクトリを利用する
ためには、<tt/service/ は <tt>&bsol;&bsol;zimmerman&bsol;public</tt> 
となります。シェルのプロンプトからこのコマンドを利用する場合は、バック
スラッシュをエスケープしないといけませんから、結局次のように入力する必
要があります。

<code>
    /usr/sbin/smbclient \\\\zimmerman\\public mypasswd
</code>

<tt/mypassword/ には、あなたの パスワードをそのまま書いてください。

===訳注===

以下は松本＠京大人間環境さんによるもうちょっと簡単な入力方法です。

<code>
    /usr/sbin/smbclient '\\zimmerman\public' mypasswd
</code>

==訳注終==

以下のような <tt/smbclient/ のプロンプトが出てきます。

<code>
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: \> 
</code>

<tt/h/ と打てば、<tt/smbclient/ のヘルプが得られます。

<code>
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: \> 
</code>

ftp を使える人なら、man ページを見るまでもなく <tt/smbclient/ が使える
ようになるでしょう。

<sect>Linux マシンのプリンタを Windows マシンから利用する
<p>

Linux のプリンタを Windows から利用するには、Linux 上でプリンタがちゃ
んと動作するように正しく設定されている必要があります。Linux でのプリン
トができていれば SMB での共有は簡単です。

ローカルプリンタの設定については Printing HOWTO をみてください。

筆者自身は Windows NT に接続されているプリンタを使っているので、この節
に書いてあることは絶対に正しいとは限りません。助言程度に受けとめておい
てください。もし具体的な使用経験を持っている方がいらっしゃいましたら、
どうぞ
<htmlurl url="mailto:dwood@plugged.net.au" name="dwood@plugged.net.au">
まで知らせてください。そうすればこの章の内容を完成できます。

<tt/smb.conf/ にプリンタの設定を加えます。

<code>
[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
</code>

プリンタのセクションにおける <tt/path/ には、<tt>/etc/printcap</tt> で
設定したスプールディレクトリと同じディレクトリを指定してください。

注意: Samba を使って Unix マシンのプリンタを Windows NT マシンから共有
させる際には問題点がいくつかあります。そのうちの一つは、NT からは
共有プリンタが正しく見えないというものです。この問題を解決するには
Samba 配布パッケージの <tt>docs/WinNT.txt</tt> ファイルを参照して下さ
い。パスワードに関する問題もあります。こちらの方は同ファイルを見ても、
いらいらするだけで解決にはなりません...

===訳注===

訳者は Linux につながっている Epson MJ-700V2C を Samba で公開し 
Windows 95 から使っていますので、その設定内容を以下に記します。ただし、
公開先はプライベートアドレスのついたネットワークなので、基本的にセキュ
リティのことは考えていません。

まず <tt/smb.conf/ です。
<code>
[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
</code>

<tt>/etc/printcap</tt> です。

<code>
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:
</code>

インプットフィルタの <tt>/var/spool/lpd/lp/incat</tt> です。

<code>
#!/bin/sh
/bin/cat
exit 0
</code>

Windows 95 からは、ネットワークドライブを選択した後 MJ-700V2C のドラ
イバを手で選んでインストールする必要があります。

==訳注終==


<sect>Linux マシンから Windows のプリンタを使う
<p>

Windows マシン上のプリンタを共有するためには以下の作業が必要です。

<enum>

<item><tt>/etc/printcap</tt> に正しいエントリが必要で、それらはローカ
ルなディレクトリ構造に準じたものである必要があります（スプールディレク
トリの設定など）。

<item><tt>/usr/bin/smbprint</tt> スクリプトが必要です。これは Samba の
ソースパッケージに付いてきますが、Samba のバイナリ配布パッケージには付
いてこないかもしれません。後でオリジナルを少々修正したものを載せます。

<item>ASCII ファイルを Postscript 形式に変換する必要がある場合には、
<tt/nenscript/ などの Postscript コンバータを準備する必要があります。
<tt/nenscript/ は通常は <tt>/usr/bin</tt> にインストールされています。

<item>Samba を利用した印刷を容易にしてくれるようなフロントエンドが欲し
ければ、以下に記した簡単な perl スクリプトを試して下さい。ASCII、
Postscript、created Postscript が扱えるようになっています。

</enum>

以下に記すのは、Windows NT プリンタに接続された HP 5MP プリンタを利用
するための <tt>/etc/printcap</tt> へのエントリです。それぞれの内容は以
下の通りです。

<descrip>
<tag/cm/ コメント
<tag/lp/ 出力に使うデバイス名
<tag/sd/ このプリンタのためのスプールディレクトリ
<tag/af/ アカウントファイル
<tag/mx/ 最大のファイルサイズ（0 にすれば無制限になります）
<tag/if/ 入力に用いられるフィルタ（またはスクリプト）
</descrip>

さらに情報が必要なら、Printing HOWTO や <tt/printcap/ の man ページを
見て下さい。

<code>
# /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:
</code>


スプールディレクトリとアカウントファイルが存在しており、書き込み可能で
あることを確認しておいて下さい。また <tt/printcap/ の <tt/if/ 行に、以
下に記す <tt/smbprint/ スクリプトへの正しいパスが設定されていること、
<tt/lp/ 行に <tt>/dev</tt> ディレクトリにある正しいデバイスが設定され
ていることも確認して下さい。

次は <tt/smbprint/ です。これは通常 <tt>/usr/bin</tt> に置かれており、
Samba を作った Andrew Tridgell 本人によって書かれたものです（筆者の知
らない Samba の共作者が他にいらっしゃったらすみません）。これは Samba 
のソースパッケージに入っていますが、バイナリ配布の場合には無いかも知れ
ませんので、以下に私が少々手を加えたものを示しておきます。

以下に記したスクリプトを注意深く見て下さい。これはオリジナルを修正した
もので、多少使いやすくなっていると思います。

<code>
#!/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
</code>

ほとんどの Linux パッケージには、ASCII 文書を Postscript にする 
<tt/nenscript/ コマンドが含まれています。以下の perl スクリプトは、
<tt/smbprint/ を使って印刷する際に、よりシンプルなインターフェースを提
供するものです。

<code>
Usage: print [-a|c|p] <filename>
       -a prints <filename> as ASCII
       -c prints <filename> formatted as source code
       -p prints <filename> as Postscript
        If no switch is given, print attempts to
        guess the file type and print appropriately.
</code>

<tt/smbprint/ を使って ASCII ファイルを印刷すると、長い行は改行されて
しまいます。このスクリプトでは、可能な限り単語の途中ではなく、空白で改
行するようにしています。

ソースコードのフォーマットには <tt/nenscript/ を用いています。ASCII ファ
イルは 2 段組みに整形され、ヘッダ（日付、ファイル名など）がつきます。
このスクリプトを雛形にして、他の整形方法を用いることもできるでしょう。

Postscript の文書はすでに整形されているものとみなして、そのまま通すよ
うになっています。

<code>
#!/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!";
}

&ero;ParseCmdLine(@ARGV);

# DBG
print "filetype is $filetype\n";

if ($filetype eq "ASCII") {
	&ero;wrap($line_length);
} elsif ($filetype eq "code") {
	&ero;codeformat;
} elsif ($filetype eq "ps") {
	&ero;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) {
		&ero;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] <filename>
       -a prints <filename> as ASCII
       -c prints <filename> formatted as source code
       -p prints <filename> 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(<FILE>) {
		$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
	&ero;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(<FILE>) {
		push(@newlines,$_);
	}
	close(FILE);
	system("rm $tmpfile");
}

sub createarray {
	# Create the array for postscript
	open(FILE, "<$file") || die "Can't open $file: $!\n";
	while(<FILE>) {
		push(@newlines,$_);
	}
	close(FILE);
}
</code>

===訳注===

<tt/nenscrpt/ は日本語を通しませんが、JE には <tt/psconv/ という日本語
に対応したコマンドが入っています。他にも <tt/a2ps/、<tt/ps2ascii/、
<tt/ps2txt/、<tt/toPS/ など様々なものがネットワークから入手可能です。

なお、訳者はこの章のスクリプトをテストできる環境がありませんので、原文
にあったスクリプトをそのまま載せておきました。改造して日本語を通すこと
に成功した方は、ご連絡下されば幸いです。

==訳注終==

<sect>著作権
<p>

この HOWTO 文書の著作権は 1996 年以降 David Wood にあるものとします。
この節の宣言を含むすべての文書が変更されない限りにおいて、あらゆる形式
へのこの文書の複製、およびその再配布を許可します。

<sect>謝辞
<p>

もしメールで御意見をいただければ、次の版のリリースの際に、この節でお名
前を挙げて感謝したいと思います。

===訳注===

日本語への翻訳に当たっては、
<tscreen><verb>
岡本一幸さん ikko-@pacific.rim.or.jp
桑村　潤さん juk@rccm.co.jp
松本庄司さん shom@i.h.kyoto-u.ac.jp
箕浦逸史さん minoura@biol.s.u-tokyo.ac.jp
</verb></tscreen>
に誤訳の指摘や有益なコメントをいただきました。

==訳注終==

</article>
