次のページ 前のページ 目次へ

7. どうやって設定するのか、基本

7.1 伝統的な lpd の設定方法

lpd に対する最小限の設定は、キューにファイルを取り込み、それを 印刷できるようにすることです。プリンタがそのことを理解するか どうかに注意を払う必要はありません。ただ、魅力的な出力はおそらく 得られないでしょう。それでも、理解する為の第1段階です。読み続けて ください!

基本的に、lpd に印刷キューを追加するには、/etc/printcap の中にエントリを追加し、/var/spool/lpd の下に新しい スプール用のディレクトリを作成する必要があります。

/etc/printcap のエントリは以下のようになっています。

# LOCAL djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:
この設定では、lpdj または deskjet と呼ばれるスプール を定義し、/var/spool/lpd/dj ディレクトリにスプールします。 そしてジョブ毎の最大サイズを制限せず、/dev/lp0 に指定された デバイスから印刷します。大見出しページ (印刷する人の名前等を含んでいる もの) を印刷ジョブの先頭に加えることはしません。

さぁ、 printcap の man ページを読んでみてください。

上記の設定は実に単純ですが、実際は落とし穴があります。Deskjet 500 が理解できるファイルを送っているにもかかわらず、Deskjet は奇妙な 印刷を行ってしまいます。例えば、通常の Unix のテキストファイルを 送っても、Deskjet は文字どおりに newline を翻訳してしまうのです。 つまり、こんな具合になってしまいます。

This is line one.
                 This is line two.
                                  This is line three.
どうしたものでしょう。この設定で PostScript のファイルを印刷したなら、 この "階段効果" をともなう、美しいけれどもなんの役にも立たない PostScript コマンドの列記された出力が得られることでしょう。

明らかに何かが必要です。そしてこれがフィルタを使う目的なのです。 printcap の man ページを読んだ観察力の鋭いあなたなら、スプールの 属性である ifof に気がついているかもしれません。 if つまり入力フィルタが、まさにここで必要なものなのです。

newline の前にキャリッジリターンを付け加える filter と 呼ばれる小さなシェル・スクリプトを書けば、この階段状の印刷は除去 されます。もちろん、printcap のエントリに if の行を 追加する必要があります。

lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :if=/var/spool/lpd/dj/filter:\
        :sh:

簡単な filter スクリプトはこのようになるでしょう。

#!perl
# The above line should really have the whole path to perl
# (上記の行は perl への完全なパスでなければいけません)
# This script must be executable: chmod 755 filter
# (このスクリプトは実行可能でなければいけません。
#   chmod 755 filter を実行してください)
while(<STDIN>){chop $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
# (印刷の最後に改頁が必要なら、print "\f"; を入れてください)

上記のようなことが終われば通常の Unix テキストファイルを 印刷できるようなスプールになり、意味のある結果が得られます (このフィルタを書く非常に多くのよりよい方法がありますが、 実例となるものはほとんどありません。あなたはより有効なものを 作ってください)。

残っている問題は、単なるテキストファイルを印刷することではなく、 PostScript やその他のフォーマット、またはグラフィクスを含む出力 を可能にすることです。そしてそれ自体は可能ですし、簡単なことです。 方法は前述した改行修正を行うフィルタの単純な拡張です。入力 として様々な形式のファイルを受け入れ、それぞれに Deskjet のように きれいな出力を得られるフィルタを書くことができたのなら、本当に 賢い印刷スプールになったといえます。

そのようなフィルタは、マジックフィルタ(magic filter) と呼ばれて います。奇妙なものを印刷するつもりでなければ、頭を悩ませて自分でフィルタ を書く必要はありません。ネット上には、既に多くの素晴らしいスプールが 存在しているのです。 APS フィルタは最良の選択肢の一つです。もしくは あなたの Linux ディストリビューションに、これを簡単に設定できるツールが 用意されているかもしれません。

7.2 ファイルの許可制限

広く需要があるため、私はシステム上の重要なファイルについて、以下の リストにあるような許可制限を与えています。何種類ものより良い方法が ありますが、理想的には SGID されたバイナリだけを使用すべきで、SUID root を何にでも適用すべきではありません。しかし、私のシステムはこのように 設定されていて、問題なく動作しています(率直に言うなら、ベンダで さえきちんと動作する lpd を出荷できないのですから、それは荒馬を 乗りこなそうとするようなものでしょう)。

-r-sr-sr-x   1 root     lp    /usr/bin/lpr*
-r-sr-sr-x   1 root     lp    /usr/bin/lprm*
-rwxr--r--   1 root     root  /usr/sbin/lpd*
-r-xr-sr-x   1 root     lp    /usr/sbin/lpc*
drwxrwxr-x   4 root     lp    /var/spool/lpd/
drwxr-xr-x   2 root     lp    /var/spool/lpd/lp/

小さい番号 (low-numbered) の lp サービスポートに接続されるため、 現在のところ lpd は root として実行される必要があります。バインド された後は、おそらく UID lp.lp または何かになるべきででしょう。 しかし、私はそれが何をするのかは考えません。あしからず。


次のページ 前のページ 目次へ