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><pid of inetd></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>[global]</tt>、<tt>[homes]</tt>、 <tt>[printers]</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>\\zimmerman\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>