⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printing-howto-7.html

📁 Linux初学者最好的老师就是howto了。相当于函数man。
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">
 <META NAME="GENERATOR" CONTENT="SGML-Tools 1.0.9">
 <TITLE>The Linux Printing HOWTO 中文版: 基本系统设定</TITLE>
 <LINK HREF="Printing-HOWTO-8.html" REL=next>
 <LINK HREF="Printing-HOWTO-6.html" REL=previous>
 <LINK HREF="Printing-HOWTO.html#toc7" REL=contents>
</HEAD>
<BODY>
<A HREF="Printing-HOWTO-8.html">Next</A>
<A HREF="Printing-HOWTO-6.html">Previous</A>
<A HREF="Printing-HOWTO.html#toc7">Contents</A>
<HR>
<H2><A NAME="s7">7. 基本系统设定</A></H2>

<H2><A NAME="ss7.1">7.1 传统的 lpd 设定</A>
</H2>

<P>最基本的 lpd 设定只能让系统伫列档案然後列印, 而不管你的印表机能否认得这些档案,
可能也无法让你产生吸引人的报表. 但无论如何, 这是跨向理解的第一步.
所以让我们看下去.
<P>基本上, 要增加一个列印伫列, 你必须在 <EM>/etc/printcap</EM> 中加一笔记录, 
以及在 <EM>/var/spool/lpd</EM> 之下建立一个列印暂存器的工作目录(spool 
directory).
<P><EM>/etc/printcap</EM> 中的记录看起来像这个样子:
<BLOCKQUOTE><CODE>
<PRE>
# LOCAL djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :sh:
</PRE>
</CODE></BLOCKQUOTE>

这个例子定义了一个名为 <EM>lp</EM>, <EM>dj</EM>, 或是 <EM>deskjet</EM> 的列印暂存器,
暂存器的工作目录在 <EM>/var/spool/lpd/dj</EM>, 没有单一工作大小的上限, 
列印的装置是 <EM>/dev/lp0</EM>, 而且不会在每一个工作之前加上标题页
(有著列印人的姓名之类的资料).
<P>现在就去看看 <EM>
<A HREF="http://www.picante.com/~gtaylor/pht/man/printcap.5.html">printcap</A></EM>.
的线上手□.
<P>上面这个例子看起来非常简单, 但是有一个问题 - 除非 DeskJet 500 
能看懂我送出去的档案, 否则便会印出乱码. 举例来说,
假如送一个传统的 Unix 文字档案给 deskjet 会导致新行字元(newline)
被逐字列印, 而得下面的结果:
<BLOCKQUOTE><CODE>
<PRE>
This is line one.
                 This is line two.
                                  This is line three.
</PRE>
</CODE></BLOCKQUOTE>

同样的, 列印一个 PostScript 档到这个列印暂存器会得到同样阶梯状的
PostScript 命令列表, 而不是我们需要的结果.
<P>很显然我们还需要些什麽, 这就是 filtering 的目的. 看过 printcap 
线上手□的比较细心的读者可能已经注意到 <EM>if</EM> 及 <EM>of</EM> 
这两个属性. 其中的 <EM>if</EM>, input filter 就是我们现在所需要的.
<P>假使我们写个短短的 shell script 叫 <EM>filter</EM> 
使之在新行字元之前加上回车字元(carriage return), 就可以消除阶梯状. 
所以我们必须在前面的 printcap 的记录中加上 <EM>if</EM> 这一行:
<BLOCKQUOTE><CODE>
<PRE>
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :mx#0:\
        :lp=/dev/lp0:\
        :if=/var/spool/lpd/dj/filter:\
        :sh:
</PRE>
</CODE></BLOCKQUOTE>

这个短短的 filter script 可以是:
<BLOCKQUOTE><CODE>
<PRE>
#!perl
# The above line should really have the whole path to perl
# This script must be executable: chmod 755 filter
while(&lt;STDIN>){chop $_; print "$_\r\n";};
# You might also want to end with a form feed: print "\f";
</PRE>
</CODE></BLOCKQUOTE>

假如我们照上面的方法, 我们就会得到一个能正常印出普通 Unix 文字档的列印暂存器.
(还有其他四百万种更好的方法来写这个命令稿, 但是这个很适合举例, 
你可以自己写一个更有效率的.)
<P>剩下的唯一问题是只能印出纯文字档实在是不够好 - 如果能够印出 PostScript
或是其它格式化的或是图形输出就更棒了. 这可以做的到, 也很容易做到.
方法就是延伸前面的 filter. 如果你写出一个能接受任意档案格式,
然後针对每种情况都可以产生 DeskJet 所要的资料的 filter, 
那你就有了一个智慧型的列印暂存器.
<P>这种 filter 称之为 <EM>magic</EM> filter. 你无需自己写一个, 除非你要印的东西很奇怪.
网路上已经有很多写好的, APS Filter 就是非常棒的一个. 也说不定你的 Linux
发行版本(distribution) 已经包括了一个印表机设定工具使得这一切都很容易.
<P>
<H2><A NAME="ss7.2">7.2 档案权限</A>
</H2>

<P>应大众要求, 我把我系统上一些相关档案的权限列出. 还有其它更好的设定方法,
最好是只将执行档设为 SGID 而不要设为 SUID root, 但这是我系统预设的设定,
而且运作正常.(老实说, 如果你的厂商连可以运作的 lpd 都无法提供, 你就有苦头吃了.)
<BLOCKQUOTE><CODE>
<PRE>
-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/
</PRE>
</CODE></BLOCKQUOTE>
<P>Lpd 目前必须以 root 身份执行才能连接到低号(连接埠号低於 1024)的 lp 服务埠. 
可能应该改成在连接後将使用者身份变成 lp 或其他身份, 但是我不认为现在有这样做. 
令人有些失望.
<P>
<HR>
<A HREF="Printing-HOWTO-8.html">Next</A>
<A HREF="Printing-HOWTO-6.html">Previous</A>
<A HREF="Printing-HOWTO.html#toc7">Contents</A>
</BODY>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -