FreeBSD ハンドブック : プリンタの利用 : プリンタ設定上級編 : リモートプリンタからの出力
Previous: ヘッダページ
Next: プリンタの利用に制約を与える

7.6.3. リモートプリンタからの出力

FreeBSD では, ネットワーク越しの印字, すなわち, ジョブをリ モートプリンタに送ることをサポートしています. リモートプリンタ からの出力をするには, 一般に, 次の2つを参照してください.

7.6.3.1. リモートホストに接続されたプリンタ

LPD スプーリングシステムでは LPD (または LPD 互換のシス テム) が起動している他のホストへジョブを送る機能が始めからサポー トされています. この機能により, あるホストに接続されたプリンタ へ, 他のホストからアクセスできるようになります. また, LPD プ ロトコルを理解するネットワークインタフェースを持ったプリンタに 対しても, この機能は働きます.

リモートプリンタへの出力を許可するためには, 最初に, あるホスト (これを, プリンタホストと呼びます) にプリンタを接続します. そして, 「 プリンタ設定導入編 」に書かれた簡単なプリンタの設定をおこなってください. 必要ならば, 「 プリンタ設定上級編」にあ る, 更に進んだ設定をおこなってください. そして, そのプリンタをテス トしてうまく動作することを確認し, LPD に許可した機能がうまく働 くかどうかを見てください. さらに ローカルホストプリンタホスト の LPD サービスの使用を許可されているか確認して 下さい (「 リモートホストからのプリンタの利用を制限する」参照).

LPD 互換のネットワークインタフェースを持つプリンタを使用してい る場合は, そのプリンタ自身が以下で説明するプリンタホスト になります. そして, プリンタ名とは, そのプリンタに設定し た名前のことを指します. これについては, プリンタ, および (また は), プリンタのネットワークインタフェースに付属するドキュメン トを参照してください.

次に, そのプリンタにアクセスしたいと思っている他ホストにおいて, そのホストの /etc/printcap ファイルに次にあげるエント リを作ります.

  1. 名前のエントリ. どんな名前でもよいのですが, 簡単 のため, 多分, プリンタホストで設定されたプリンタ名や別 名と同じものを使いたいと思うでしょう.
  2. lp 項目で指定されるデバイスは明示的に空にす る (:lp=: とする).
  3. スプーリングディレクトリを作成し, sd 項目で その位置を指定する. LPD では, プリンタホストにジョブ を送信するまでの間, このディレクトリにジョブを格納しま す.
  4. rm 項目でプリンタホストの名前を指定します.
  5. rp 項目でプリンタホストに接続したプリン タ名を指定します.
これで終わりです. 変換フィルタやページの大きさやその他の事項を /etc/printcap に加える必要はありません.

次に, リモートホストに接続されたプリンタで印字するための設定例 を示します. ホスト rose には2台のプリンタ bamboorattan が接続されています. これらのプリンタをホスト orchid のユーザが使えるようにしましょう. 最初に orchid の /etc/printcap を示します (このファイルは, 「 ヘッダペー ジの出力を許可する」で参照することができます). このファイルには, 既に, プリンタ teak 用のエントリがありました. 以下では, これに, ホスト rose にある2台のプリンタ用のエントリが加えられ ています.


#
#  /etc/printcap for host orchid - added (remote) printers on rose
#

#
#  teak is local; it is connected directly to orchid:
#
teak|hp|laserjet|Hewlett Packard LaserJet 3Si:\
	:lp=/dev/lpt0:sd=/var/spool/lpd/teak:mx#0:\
	:if=/usr/local/libexec/ifhp:\
	:vf=/usr/local/libexec/vfhp:\
	:of=/usr/local/libexec/ofhp:

#
#  rattan is connected to rose; send jobs for rattan to rose:
#
rattan|line|diablo|lp|Diablo 630 Line Printer:\
	:lp=:rm=rose:rp=rattan:sd=/var/spool/lpd/rattan:

#
#  bamboo is connected to rose as well:
#
bamboo|ps|PS|S|panasonic|Panasonic KX-P4455 PostScript v51.4:\
	:lp=:rm=rose:rp=bamboo:sd=/var/spool/lpd/bamboo:

orchid で必要となる作業はスプーリングディレクトリを作ることだ けです.
mkdir -p /var/spool/lpd/rattan /var/spool/lpd/bamboo
chmod 770 /var/spool/lpd/rattan /var/spool/lpd/bamboo
chown daemon.daemon /var/spool/lpd/rattan /var/spool/lpd/bamboo

これで, orchid のユーザが rattanbamboo で印字す ることができるようになりました. 例えば, orchid のユーザが次の ように入力したとします.

lpr -P bamboo -d sushi-review.dvi
すると, orchid の LPD システムは, ジョブをスプーリングディレ クトリ /var/spool/lpd/bamboo にコピーし, これが DVI ファイルを印字するジョブであることを記録します. ホスト rose の bamboo 用のスプーリングディレクトリに十分な容量が確保でき 次第, 両者の LPD は, ジョブのファイルを rose に転送します. こ のファイルは, そのすべてが印字されるまで, rose のキューに留まり ます. (bamboo は PostScript プリンタなので) DVI から PostScript への変換は rose でおこなわれます.

7.6.3.2. ネットワークにおけるデータストリームのインタ フェースを持つプリンタ

プリンタのネットワークインタフェースカードは, 2種類に分 類することができます. 1つはスプーラをエミュレートするもの (高価) で, もう1つはシリアルやパラレルポートを使うようにプリンタにデー タを送ることができるだけのもの (安価) です. この節では, 後者の使 い方を説明します. 前者のプリンタは, 前節「 リモート ホストに接続されたプリンタ」 の方法が適用できます.

/etc/printcap ファイルでは, シリアルかパラレルのイン タフェースのどちらを使うのか, そして, (シリアルインタフェース を使う場合) そのボーレートはいくらであるか, フロー制御は使うのか, タブのための遅延を加えるのか, 改行文字を変換するかなどの指定を おこなうことができます. しかし, TCP/IP や他のネットワークポートか らデータを受け取るプリンタを接続するための指定をおこなうことはでき ません.

ネットワーク接続されたプリンタにデータを送るためには, テキスト フィルタと変換フィルタから呼び出すことができる通信プログラムを 開発する必要があります. 以下に, そのようなプログラムの例を示し ます. スクリプト netprint では, 標準入力から印字データを すべて受け取り, ネットワーク接続されたプリンタにこれを送ります. netprint の最初の引数でプリンタのホスト名を, 2番目の引数 で接続するポート番号を指定します. このプログラムでは単方向通信 (FreeBSD からプリンタ) のみをサポートしていることに注意してくだ さい. ネットワークプリンタの多くは双方向通信をサポートしていま すので, その恩恵 (プリンタの状態を得たり, 課金をおこなうなど) にあず かりたいと思われるかもしれません.


#!/usr/bin/perl
#
#  netprint - Text filter for printer attached to network
#  Installed in /usr/local/libexec/netprint
#

$#ARGV eq 1 || die "Usage: $0 <printer-hostname> <port-number>";

$printer_host = $ARGV[0];
$printer_port = $ARGV[1];

require 'sys/socket.ph';

($ignore, $ignore, $protocol) = getprotobyname('tcp');
($ignore, $ignore, $ignore, $ignore, $address)
    = gethostbyname($printer_host);

$sockaddr = pack('S n a4 x8', &AF_INET, $printer_port, $address);

socket(PRINTER, &PF_INET, &SOCK_STREAM, $protocol)
    || die "Can't create TCP/IP stream socket: $!";
connect(PRINTER, $sockaddr) || die "Can't contact $printer_host: $!";
while (<STDIN>) { print PRINTER; }
exit 0;

このスクリプトは, 様々なフィルタが利用することができます. 仮に, Diablo 750-N ラインプリンタを持っており, これがネットワークに 接続されているとしましょう. プリンタはポート番号5100にて印字す るデータを受け取ります. プリンタのホスト名は scrivener としま す. このとき, このプリンタのテキストフィルタは次のようになりま す.
#!/bin/sh
#
#  diablo-if-net - Text filter for Diablo printer `scrivener' listening
#  on port 5100.  Installed in /usr/local/libexec/diablo-if-net
#

exec /usr/libexec/lpr/lpf "$@" | /usr/local/libexec/netprint scrivener 5100


FreeBSD ハンドブック : プリンタの利用 : プリンタ設定上級編 : リモートプリンタからの出力
Previous: ヘッダページ
Next: プリンタの利用に制約を与える