Linux 版 (精华区)
发信人: tcpip (高级草包), 信区: Linux
标 题: 打印及传真 - 7. 基本系统设定
发信站: 紫 丁 香 (Tue Apr 11 19:11:30 2000) WWW-POST
打印及传真 - 7. 基本系统设定
7.1 传统的 lpd 设定
最基本的 lpd 设定只能让系统队列文件然后打印, 而不管你的打印机能否认得这些文件
, 可能也无法让你产生吸引人的报表. 但无论如何, 这是跨向理解的第一步. 所以让我们
看下去.
基本上, 要增加一个打印队列, 你必须在 /etc/printcap 中加一笔记录, 以及在
/var/spool/lpd 之下建立一个打印暂存器的工作目录(spool directory).
/etc/printcap 中的记录看起来像这个样子:
# LOCAL djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
这个例子定义了一个名为 lp, dj, 或是 deskjet 的打印暂存器, 暂存器的工作目录在
/var/spool/lpd/dj, 没有单一工作大小的上限, 打印的装置是 /dev/lp0, 而且不会在每
一个工作之前加上标题页 (有著打印人的姓名之类的数据).
现在就去看看 printcap. 的在线手□.
上面这个例子看起来非常简单, 但是有一个问题 - 除非 DeskJet 500 能看懂我送出去的
文件, 否则便会印出乱码. 举例来说, 假如送一个传统的 Unix 文字文件给 deskjet 会
导致新行字符(newline) 被逐字打印, 而得下面的结果:
This is line one.
This is line two.
This is line three.
同样的, 打印一个 PostScript 档到这个打印暂存器会得到同样阶梯状的 PostScript 命
令列表, 而不是我们需要的结果.
很显然我们还需要些什么, 这就是 filtering 的目的. 看过 printcap 在线手□的比较
细心的读者可能已经注意到 if 及 of 这两个属性. 其中的 if, input filter 就是我们
现在所需要的.
假使我们写个短短的 shell script 叫 filter 使之在新行字符之前加上回车字符
(carriage return), 就可以消除阶梯状. 所以我们必须在前面的 printcap 的记录中加
上 if 这一行:
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
这个短短的 filter script 可以是:
#!perl
# The above line should really have the whole path to perl
# This script must be executable: chmod 755 filter
while(){chop $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
假如我们照上面的方法, 我们就会得到一个能正常印出普通 Unix 文本文件的打印暂存器
. (还有其他四百万种更好的方法来写这个脚本文件, 但是这个很适合举例, 你可以自己
写一个更有效率的.)
剩下的唯一问题是只能印出纯文本文件实在是不够好 - 如果能够印出 PostScript 或是
其它格式化的或是图形输出就更棒了. 这可以做的到, 也很容易做到. 方法就是延伸前面
的 filter. 如果你写出一个能接受任意文件格式, 然后针对每种情况都可以产生
DeskJet 所要的数据的 filter, 那你就有了一个智慧型的打印暂存器.
这种 filter 称之为 magic filter. 你无需自己写一个, 除非你要印的东西很奇怪. 网
络上已经有很多写好的, APS Filter 就是非常棒的一个. 也说不定你的 Linux 发行版本
(distribution) 已经包括了一个打印机设定工具使得这一切都很容易.
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/
Lpd 目前必须以 root 身份执行才能连接到低号(连接埠号低於 1024)的 lp 服务埠. 可
能应该改成在连接後将使用者身份变成 lp 或其他身份, 但是我不认为现在有这样做. 令
人有些失望.
7.1 传统的 lpd 设定
最基本的 lpd 设定只能让系统队列文件然后打印, 而不管你的打印机能否认得这些文件
, 可能也无法让你产生吸引人的报表. 但无论如何, 这是跨向理解的第一步. 所以让我们
看下去.
基本上, 要增加一个打印队列, 你必须在 /etc/printcap 中加一笔记录, 以及在
/var/spool/lpd 之下建立一个打印暂存器的工作目录(spool directory).
/etc/printcap 中的记录看起来像这个样子:
# LOCAL djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
这个例子定义了一个名为 lp, dj, 或是 deskjet 的打印暂存器, 暂存器的工作目录在
/var/spool/lpd/dj, 没有单一工作大小的上限, 打印的装置是 /dev/lp0, 而且不会在每
一个工作之前加上标题页 (有著打印人的姓名之类的数据).
现在就去看看 printcap. 的在线手□.
上面这个例子看起来非常简单, 但是有一个问题 - 除非 DeskJet 500 能看懂我送出去的
文件, 否则便会印出乱码. 举例来说, 假如送一个传统的 Unix 文字文件给 deskjet 会
导致新行字符(newline) 被逐字打印, 而得下面的结果:
This is line one.
This is line two.
This is line three.
同样的, 打印一个 PostScript 档到这个打印暂存器会得到同样阶梯状的 PostScript 命
令列表, 而不是我们需要的结果.
很显然我们还需要些什么, 这就是 filtering 的目的. 看过 printcap 在线手□的比较
细心的读者可能已经注意到 if 及 of 这两个属性. 其中的 if, input filter 就是我们
现在所需要的.
假使我们写个短短的 shell script 叫 filter 使之在新行字符之前加上回车字符
(carriage return), 就可以消除阶梯状. 所以我们必须在前面的 printcap 的记录中加
上 if 这一行:
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
这个短短的 filter script 可以是:
#!perl
# The above line should really have the whole path to perl
# This script must be executable: chmod 755 filter
while(){chop $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
假如我们照上面的方法, 我们就会得到一个能正常印出普通 Unix 文本文件的打印暂存器
. (还有其他四百万种更好的方法来写这个脚本文件, 但是这个很适合举例, 你可以自己
写一个更有效率的.)
剩下的唯一问题是只能印出纯文本文件实在是不够好 - 如果能够印出 PostScript 或是
其它格式化的或是图形输出就更棒了. 这可以做的到, 也很容易做到. 方法就是延伸前面
的 filter. 如果你写出一个能接受任意文件格式, 然后针对每种情况都可以产生
DeskJet 所要的数据的 filter, 那你就有了一个智慧型的打印暂存器.
这种 filter 称之为 magic filter. 你无需自己写一个, 除非你要印的东西很奇怪. 网
络上已经有很多写好的, APS Filter 就是非常棒的一个. 也说不定你的 Linux 发行版本
(distribution) 已经包括了一个打印机设定工具使得这一切都很容易.
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/
Lpd 目前必须以 root 身份执行才能连接到低号(连接埠号低於 1024)的 lp 服务埠. 可
能应该改成在连接後将使用者身份变成 lp 或其他身份, 但是我不认为现在有这样做. 令
人有些失望.
--
"这一千多年没写诗了?"
"写了, 不过只写了两句."
"千年得两句, 一定是万古丽句了. 念来听听."
"好吧, 我现丑了" 太白星清了清嗓子, 浑厚的男中音在天庭响起:
大海啊, 都是水;
骏马啊, 四条腿;
※ 来源:·紫 丁 香 bbs.hit.edu.cn·[FROM: tcpip.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.501毫秒