驯服打印机和打印的恐惧,第一部分
本周,我将涉足令人恐惧的领域。多年来,我看到了关于系统管理员和打印机的几种估计。其中一个数字(有一个相当有力的论据支持这些数字)指出,打印机管理大约占 系统管理员时间的 25%。如果您认为打印机很有趣,请尝试在您的技术支持人员的隔间附近转转(假设您自己不是其中之一),并等待打印机呼叫进来。您应该不必等待太久。接下来,注意当他们被告知是打印机问题时脸上的表情。
我自己也有点避免处理打印机(尽管你们中的一些人向我发送了涵盖该主题的请求)。原因是,像大多数系统管理员一样,我也讨厌处理打印机。在接下来的几篇文章中,我将展示如何使 打印机地狱 更接近打印机天堂。在这样做时,我将引导您了解打印时真正发生的事情的基础知识。掌握了打印的要点之后,我们将研究一些巧妙的工具和技术,这些工具和技术为您的日常打印需求增加了前所未有的灵活性。
Linux 为我们提供了许多打印选项。我们可以进行文本、Postscript、本地打印机以及 lpd 远程打印。如果需要,我们甚至可以创建队列,将打印定向到我们同事的 Windows 9x 打印机,或者为 Windows 9x 用户提供 Linux 打印服务(使用 Samba)。一台打印机通常还可以,但再添加几台,您就会发现自己 真的 难以应付。Linux 在这里 所做 的是提供广泛的选项来处理所有这些多样性。
让我们回到最初(好吧,几乎是),看看这一切是如何实际运作的,从您的老朋友——并行打印机开始。
基本的 PC 架构通常只有一个并行端口。该端口上的打印机实际上会连接到 /dev/lp0。如果您的 PC 有多个并行连接器(或者您添加了打印卡),则第二个和第三个端口将分别为 /dev/lp1 和 /dev/lp2。现在,让我们假设您有一台基本的、普通的打印机连接到第一个并行端口。打印可以像这样简单(或奇怪)
# echo "This is a test." > /dev/lp0 # echo "Please ignore this print job." > /dev/lp0 # echo "There is nothing of value here." > /dev/lp0 # echo "^L" > /dev/lp0
最后一行,带有 ctrl-L,意思是“向打印机发送换页符以弹出页面。” 现在这个简单的作业的输出看起来像这样
This is a test. Please ignore this print job. There is nothing of value here.
这就是我的打印机配置工具所指的“文本阶梯式排列”。您可能也听说过它被称为“阶梯效应”。发生的情况是,我的打印机(在本例中为 LaserJet 5L)期望 PCL(其本机打印机命令语言)或 DOS 样式的文本。这意味着每行末尾的回车符和换行符,这与 Linux 文件不同,Linux 文件默认为仅换行符。无论如何,这很好地展示了对过滤器的需求。
让我们取完全相同的(非)信息行(减去 echo "^L" 行)并创建一个名为 testfile 的文件。我为此使用了 pico,但您可以使用任何让您满意的编辑器。如果我们像以前一样简单地 cat 文件到打印机(使用 cat testfile > /dev/lp0),结果是相同的。让我们构建一个过滤器。这是我的过滤器的样子
#!/bin/bash echo -ne \\033&k2G cat echo -ne \\f
没什么特别的,不是吗?第一个 echo 行发送命令,告诉我的 LaserJet 将 Linux 换行符转换为回车符,后跟换行符,一个八进制转义字符,后跟打印机控制序列 &k2G。这是 HP 代码,因此您的打印机可能需要不同的代码。下一行只是接受您给它的输入并将其原封不动地传递过去。最后一行发送换页符以弹出页面。我将文件命名为“dosfilter”,将其移动到 /usr/local/bin 并使其可执行。
# cp dosfilter /usr/local/bin # chmod 755 dosfilter
现在,让我们重新发送作业并使用过滤器
# cat testfile | /usr/local/bin/dosfilter > /dev/lp0
现在我的文本看起来正常了,一行接一行,并且正确对齐。非常整洁,但在 Real LifeTM 中,我们通常不会以这种方式将作业发送到打印机。我们在系统上创建打印机,并通过假脱机发送作业。让我们创建一个名为“lptest”的假脱机程序定义。通过编辑 /etc/printcap 并添加以下信息来完成此操作。请记住,printcap 文件对它的布局方式非常挑剔。这就是您收到的 Linux 系统指南(假设您购买了一个精美的盒装套装)告诉您使用 printtool 或类似工具的原因。从长远来看,学习以困难的方式做事更有趣。稍后,我们将使用漂亮的工具。(是的——/etc/printcap 文件。)它看起来像这样
lptest: :sd=/var/spool/lpd/lptest: :mx#0: :sh: :lp=/dev/lp0: :if=/usr/local/bin/dosfilter:
这就是所有这些的含义。第一行只是打印机名称。如果我使用 lpr 命令将作业发送到打印机,我将指定此队列名称。下一行指的是假脱机目录;换句话说,当前作业的所有相关信息都放在哪里。这是 /var/spool/lpd 目录下的一个目录(默认情况下),但它理论上可以放在您喜欢的任何位置。/var/spool/lpd 只是约定俗成。我喜欢使用与队列名称相同的目录名称(我就是这样有趣)。
“mx”指的是您允许发送到打印机的最大文件大小。 零 表示无限制。下一行 (:sh:) 表示“禁止页眉页脚”。由于这是一个物理连接的设备,我们有 lp 选项,它定义了并行设备本身(/dev/lp0 因为我只有一个并行端口)。最后一行指的是我的输入过滤器,即我们之前创建的 dosfilter。
要使这一切正常工作,您只需创建假脱机目录 (/var/spool/lpd/lptest) 并将您的作业发送到打印机。
# mkdir /var/spool/lpd/lptest # lpr -Plptest testfile
您的作业是否获得了额外的、不需要的换页符?如果是这样,请修改您的 dosfilter 并删除(或注释掉)换页符行。另一种方法是,如果您不想修改您的 dosfilter,只需在 /etc/printcap 定义中添加另一个参数,该参数告诉打印子系统“禁止换页”。该行将如下所示
:sf:
选项 sh 和 sf 是布尔值。它们在 /etc/printcap 文件中的存在意味着“true”。由您决定这些东西最好放在哪里(在 printcap 中还是在过滤器中)。有关 printcap 选项的更完整列表,您可以使用 man 并查看页面。
# man printcap
默认情况下,当您使用 lpr 命令将作业发送到打印机时,它使用一个名为“lp”的队列定义(与 lptest 或您为队列指定的任何名称相反)。如果队列仅命名为“lp”,则您需要打印的唯一命令是这个
# lpr printfile_name
这就是我们使用命令的完整形式的原因。
# lpr -Pprint_queue_name printfile_name
如果您始终打印到特定的打印机,您可以将 PRINTER 环境变量添加到您的 $HOME/.bash_profile 中。
PRINTER=lptest ; export PRINTER
现在,在您登录后,您所要做的(假设您想打印到 lptest)是键入第一个、更简单版本的打印命令 (lpr printfile_name)。
在我们结束本周之前,让我们看看打印到远程 Linux(或 UNIX)打印机。让我们在当前机器(称为 nearlinux)上创建一个名为“faraway”的打印机。打印机(我们之前创建的 lptest)位于另一台名为 farlinux 的机器上。这是“nearlinux”的 /etc/printcap 条目
faraway: :sd=/var/spool/lpd/faraway: :mx#0: :sh: :rm=farlinux: :rp=lptest:
这里只有几个真正的新东西。首先,定义我的打印机物理位置的 lp 行消失了。现在我们有一个 rm 选项,它指的是远程主机名(连接打印机的主机)。最后一行 :rp=lptest: 定义了该系统上远程打印机的名称。
这里唯一的注意事项是 farlinux 必须允许我打印。这通过编辑文件 /etc/hosts.lpd 并添加允许打印的机器的主机或主机 IP 地址来完成。我的 hosts.lpd 文件有这些条目
192.168.22.2 192.168.22.3 nearlinux
在这种更改之后重新启动您的 lpd 守护程序可能是一个好主意。一种方法是简单地执行 ps ax | grep lpd 并杀死当前的 lpd 进程。第二种方法(可能因系统而异)是使用这些命令
# /etc/rc.d/init.d/lpd stop # /etc/rc.d/init.d/lpd start
在某些版本中,您可以使用 restart 而不是 stop 后跟 start 将其包装在一个命令中。现在,从我的机器上,我可以将一个非常重要的文件发送到我的远程 Linux 机器进行打印。
# /usr/games/fortune -l | lpr -Pfaraway
本周的内容就到此为止。对于那些了解这一切并且仍然通读的人,我们下次见面时将研究一些关于打印机的很酷的事情。在那之前,请记住这句老话,“轻装上阵,携带大容量墨粉盒。”
电子邮件: ljeditors@ssc.com