大多数后台打印程序的功能之一是它们支持通过网络打印到物理连接到不同机器或直接连接到网络的打印机。通过仔细结合过滤器脚本和各种实用程序,您可以透明地打印到各种网络上的打印机。
要允许远程计算机使用 LPD 协议打印到您的打印机,您必须在/etc/hosts.equiv 或/etc/hosts.lpd 中列出这些计算机。(请注意,hosts.equiv 还有许多其他影响;如果您在那里列出任何计算机,请确保您知道自己在做什么)。您可以通过使用 rs 属性来仅允许其他机器上的某些用户打印到您的打印机;请阅读lpd手册页以获取相关信息。
要打印到另一台机器,您可以创建一个类似于以下的/etc/printcap 条目
# REMOTE djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :rm=machine.out.there.com:\ :rp=printername:\ :sh: |
您还可以使用 rlpr 将打印作业直接发送到远程计算机上的队列,而无需配置 lpd 来处理它。这在您只是偶尔打印到各种打印机的情况下非常有用。来自 rlpr 的公告
Rlpr 使用 TCP/IP 将打印作业发送到网络上任何地方的 lpd 服务器。
与 lpr 不同,它 *不需要* 您希望从中打印的机器显式知道远程打印机(例如,通过 /etc/printcap),因此它更加灵活,并且需要的管理更少。
rlpr 可以用于任何可能使用传统 lpr 的地方,并且向后兼容传统的 BSD lpr。
rlpr 获得的主要力量是从 *任何地方到任何地方* 远程打印的能力,而无需考虑您希望从中打印的系统是如何配置的。Rlpr 可以像传统的 lpr 一样充当过滤器,以便在远程机器(如 netscape、xemacs 等等)上执行的客户端可以轻松地打印到您的本地机器。
Rlpr 可从以下位置获得Metalab.
有一个“打印到 Windows”迷你 HOWTO,其中包含比此处更多的信息。
可以将打印队列定向通过smbclient程序(Samba 套件的一部分)定向到基于 TCP/IP 的 SMB 打印服务。Samba 包含一个执行此操作的脚本,名为smbprint。简而言之,您将特定打印机的配置文件放在后台打印目录中,并安装smbprint脚本作为 if。
/etc/printcap 条目如下所示
lp|remote-smbprinter:\ :sh:\ :lp=/dev/null:\ :sd=/var/spool/lpd/lp:\ :if=/usr/local/sbin/smbprint: |
您应该阅读smbprint脚本内的文档,以获取有关如何设置此程序的更多信息。
您还可以使用smbclient直接将文件提交到 SMB 打印服务,而无需涉及lpd。请参阅手册页。
ncpfs 套件包含一个名为nprint的实用程序,它提供与smbprint相同的功能,但用于 NetWare。您可以从 Metalab 获取 ncpfs。来自版本 0.16 的 LSM 条目
“使用 ncpfs,您可以在 Linux 下挂载 NetWare 服务器的卷。您还可以打印到 NetWare 打印队列,并将 NetWare 打印队列后台打印到 Un*x 后台打印程序。您需要内核 1.2.x 或 1.3.54 及更高版本。ncpfs 不适用于任何低于 1.3.54 的 1.3.x 内核。”
要使nprint通过 lpd 工作,您需要编写一个小型的 shell 脚本,以在 NetWare 打印机上打印 stdin,并将该脚本安装为 lpd 打印队列的 if。您将得到类似以下内容
sub2|remote-NWprinter:\ :sh:\ :lp=/dev/null:\ :sd=/var/spool/lpd/sub2:\ :if=/var/spool/lpd/nprint-script: |
#! /bin/sh # You should try the guest account with no password first! /usr/local/bin/nprint -S net -U name -P passwd -q printq-name - |
netatalk 软件包包含类似nprint和smbclient的内容。其他人已经记录了从 Apple 网络打印和打印到 Apple 网络的步骤,比我能做的要好得多;请参阅 Linux Netatalk-HOWTO。
许多打印机都带有以太网接口,您可以直接打印到该接口,通常使用 LPD 协议。您应该遵循打印机或其网络适配器随附的说明,但一般来说,此类打印机都在“运行”lpd,并提供一个或多个您可以打印到的队列。例如,HP 打印机可能使用类似以下的 printcap:
lj-5|remote-hplj:\ :sh:\ :sd=/var/spool/lpd/lj-5:\ :rm=printer.name.com:\ :rp=raw: |
带有 JetDirect 接口的 HP Laserjet 打印机通常支持两个内置的 lpd 队列 - “raw”,它接受 PCL(以及可能的 Postscript),以及 “text”,它接受纯 ascii(并自动处理阶梯效应)。如果您有 JetDirect Plus3 三端口盒,则队列名为 “raw1”、“text2” 等等。
请注意,ISS 公司已经识别出各种拒绝服务攻击,这些攻击会使 HP Jetdirect 接口挂起。这些问题中的大多数已从 98 年秋季开始得到解决。这些类型的问题在嵌入式代码中很常见;很少有电器式设备应该暴露于一般的 Internet 流量。
在大型环境中,尤其是某些打印机不支持 PostScript 的大型环境中,建立一个专用打印服务器可能很有用,所有机器都打印到该服务器,并在该服务器上运行所有 ghostscript 作业。这将允许使用 topq 和 lprm 命令暂停队列或重新排序。
这也允许您的 GNU/Linux 计算机充当打印机的后台打印服务器,以便您的网络用户可以快速完成打印作业,并继续进行其他操作,而无需等待打印机打印其他人发送的其他作业。如果您有无法修复的旧 HP Jetdirect,也建议这样做;它可以降低打印机卡死的可能性。
要执行此操作,请在您的 linux 计算机上设置一个指向配备以太网的 HP LJ 的队列(如上例所示)。现在,将 LAN 上的所有客户端设置为指向 LPD 队列(例如,上例中的 lj-5)。
某些 HP 网络打印机显然不理会客户端发送的横幅页设置;您可以通过 telnet 连接到打印机,按两次回车键,键入 “banner: 0”,然后键入 “quit” 来关闭其内部生成的横幅页。您也可以通过这种方式更改其他设置;键入 “?” 以查看列表。
可以使用 HP 的 webJetAdmin 软件控制全方位的设置。此软件包作为守护程序运行,并在指定的端口上接受 http 请求。它提供表单和 Java applet,可以控制网络上的 HP 打印机。理论上,它也可以控制 Unix 打印队列,但它使用 rexec 服务来执行此操作,这完全不安全。我不建议使用该功能。
某些打印机(和打印机网络“黑匣子”)仅支持一种简陋的非协议,涉及纯 TCP 连接;有时这被称为 “AppSocket” 协议。此类别的显着代表是早期型号的 JetDirect(包括某些 JetDirectEx)卡。基本上,要打印到打印机,您必须在指定端口(通常为 9100,或三端口盒的 9100、9101 和 9102)上打开到打印机的 TCP 连接,并将您的打印作业放入其中。LPRng 内置了将打印作业放入随机 TCP 端口的支持,但是对于 BSD lpd 来说,这并不容易。最好的方法可能是获取并使用名为 netcat 的小型实用程序。
如果不行,可以使用 Perl 以多种方式实现它,如下面的程序所示。为了获得更好的性能,请使用程序 netcat (“nc”),它以通用方式执行大致相同的事情。大多数发行版都应该以预打包的形式提供 netcat。
旧版本 lpd 的一个奇怪之处在于,if不为远程打印机运行。(0.43 或更高版本具有源自 FreeBSD 的更改,使得if始终运行)。如果您发现您需要为远程打印机运行if,并且它不适用于您的 lpr,您可以通过设置双队列并重新排队作业来执行此操作。例如,考虑以下printcap:
lj-5:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :if=/usr/lib/lpd/filter-lj-5: lj-5-remote:sh:rm=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: |
#!/bin/sh gs <options> -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 |
的-U选项仅在 lpr 作为守护程序运行时才有效,并且它正确设置重新提交队列中作业的提交者名称。您应该使用更健壮的方法来获取用户名,因为在某些情况下它不是参数 5。请参阅手册页以了解printcap.
通过使用 SAMBA 软件包,可以直接支持从 Windows(或大概是 OS/2)客户端打印到 Un*x 服务器,SAMBA 软件包还支持将您的 Un*x 文件系统共享给 Windows 客户端。
Samba 包括相当完整的文档,并且有一个很好的 Samba FAQ 也涵盖了它。您可以选择在 Un*x 计算机上配置魔法过滤器并打印 PostScript,或者在所有 Windows 计算机上安装特定于打印机的驱动程序,并为它们设置一个没有过滤器的队列。在某些情况下,依赖 Windows 驱动程序可能会产生更好的输出,但如果有很多 Windows 计算机,则管理起来会比较麻烦。因此,首先尝试 Postscript。现代版本的 Samba 应该支持 Windows NT 服务器提供的自动驱动程序下载机制,以解决此问题。
Netatalk 支持通过 EtherTalk 从 Apple 客户端打印。有关更多信息,请参阅 Netatalk HOWTO 页面。
但实际上,任何现代 Mac 都可以使用 LPD 协议通过 TCP/IP 正常打印。UVa 提供了一个非常好的 支持页面,详细介绍了如何设置它。
ncpfs 软件包包含一个名为 pserver 的守护程序,该守护程序可用于为 NetWare 打印队列提供服务。据我了解,此系统需要基于 Bindery 的 NetWare,例如 2.x、3.x 或 4.x,并启用 Bindery 访问。
有关 ncpfs 及其 pserver 程序的更多信息,请参阅 ncpfs FTP 站点。
大多数联网打印机都支持某种远程管理方法。通常有易于使用的网页用于配置。更实用的是,通常支持 SNMP 管理。通常,您可以找到有关打印机状态的有趣信息,例如墨水和纸张水平、打印量等等,并且您通常可以更改某些设置。SNMP 打印机控制和许多其他与打印相关的事项正在由 IEEE 的 打印机工作组 标准化。
Npadmin 是一个命令行程序,它为联网打印机的常见 SNMP 功能提供接口。它实现了标准的 Printer MIB,以及一些主要用于旧设备的供应商专有方案。支持打印机发现式操作和各种打印机状态查询。
npadmin 有一个优秀的 手册页,并且为许多基于 RPM 和 dpkg 的发行版分发了预编译的软件包。
除了 npadmin 之外,还有许多 SNMP 工具将非常有用。snmptraplogd 可以记录 SNMP trap 事件。这对于观察打印机卡纸、缺纸事件等非常有用;将某些事件重新传输到寻呼机或发送电子邮件将非常简单。
虽然 npadmin 为许多网络打印机的 SNMP 接口提供了简化的支持,但某些打印机可能具有 npadmin 不知道的供应商扩展。在这种情况下,您可以使用 CMU SNMP 工具,它支持任意 SNMP GET 和 SET 操作,以及 walks 等。有了这些以及少量的工作,您就可以利用打印机的 MIB 提供的任何 SNMP 功能。您可能需要从供应商处获取 MIB,以了解所有变量是什么;有时供应商认为人们实际上会使用他们提供的专有工具。
VA Linux 的 libprinterconf 包括执行网络打印机发现的代码。打印机是根据已编译到库中的打印机签名进行识别的;目前,该库不大,但确实涵盖了许多常见的联网打印机型号。