SDB:CUPS in a Nutshell

跳转到:导航搜索


本文面向有经验的 Linux 用户。

它不提供详细的解释。所有与CUPS相关的重要问题都以简洁的形式呈现。

此处的一些细节可能略有陈旧(具体取决于 CUPS 版本),但总体而言,这些内容仍然有效。

本文档描述了Linux下CUPS至2.x版本,以及那里的传统过滤系统和后端。

如今的无驱动程序打印工作流程则大不相同。

CUPS 打印系统概述

Concepts printing 解释了关于打印的基本概念。

有关一般概述,请参阅您本地机器上运行的 CUPS Web 界面 上的“CUPS 概述”页面,或参阅 CUPS.org 上您实际使用的 CUPS 版本的文档。

CUPS 主页:http://www.cups.org/

打印作业的处理阶段

以下第一步同时发生在客户端和服务器系统上。这是客户端系统上的唯一步骤。客户端系统上不存在队列。具有本地连接打印机的单个主机充当具有该打印机打印队列的 CUPS 服务器。

(I) 生成打印作业

应用程序或命令行工具生成打印作业并将其传递给 spooler。

打印作业包含 spooler 的信息、打印数据(参见 PostScriptConcepts printing)以及过滤器可选信息。

命令行工具示例

lp -d queue -t title -o option1=value1 -o option2=value2 file1 file2
  • "queue" 和 "title" 是 spooler 的信息。
  • "option1=value1" 和 "option2=value2" 是过滤器的信息。
  • "file1" 和 "file2" 是打印数据。

以下后续步骤仅发生在 CUPS 服务器上。发生以下步骤的主机是服务器。实际存在打印队列的主机是服务器(与仅存在对实际打印队列的引用的客户端相反)。

spooler (cupsd) 执行

(II) 将打印作业保存在 spool 目录中

  • 将 spooler 和过滤器的信息保存在控制文件 /var/spool/cups/c<job-number> 中
  • 将要打印的文件中的数据保存在数据文件 /var/spool/cups/d<job-number>-<file-number> 中

(III) 过滤打印数据并向打印机发送特定于打印机的数据

  • 启动过滤器系统
    • 确定生成特定于打印机的数据所需的过滤器以及建立所谓的“过滤器链”或“过滤器管道”。
    • 使用合适的参数启动过滤器链/管道中的程序。
  • 启动后端,将过滤器管道中的特定于打印机的数据发送到打印机。

(IV) 完成打印作业

  • 等待后端完成。
  • 从 spool 目录中删除相应的文件。

Spooler

Spooler 的功能

spooler 系统的主要目的是将数据从发送者移动到接收者。

  1. 接受数据(仅来自授权的发送者)。
  2. 缓冲数据(直到接收者准备好接受它们)。
  3. 将数据发送到授权的接收者(在必要时实施合适的过滤器之后)。
  4. 提供有关数据状态的信息(例如,对于“lpstat -W completed -o”)。

详细信息

/usr/sbin/cupsd

  • cupsd 是 IPP 协议 的服务器
  • cupsd 侦听 TCP 端口 631 上的 IPP 任务,例如通过“lp -d queue_name file_name”或“lpstat -t”等命令
  • cupsd 侦听 TCP 端口 631 上的 HTTP 任务,例如通过 https://:631/printers/ 管理打印机
  • cupsd 使用 UDP 端口 631 发送和接收“CUPS 浏览”信息(参见下面“CUPS 用于网络中打印的固有设计”)。使用“netcat -u -l -p 631”等命令来获取此类信息(前提是 UDP 端口 631 尚未被 cupsd 占用)
  • cupsd 的配置文件:/etc/cups/cupsd.conf(从 CUPS 1.6 开始,还有 /etc/cups/cups-files.conf)
  • systemd 单元文件 /usr/lib/systemd/system/cups.*

/usr/lib/cups/daemon/cups-lpd

  • cups-lpd 是 LPD 协议 (RFC 1179) 的服务器
  • cups-lpd 接受通过 LPD 协议通过 TCP 端口 515 传入的打印作业
  • xinetd 或 inetd 或 systemd 用作 cups-lpd 的包装器
  • 配置文件
    • 或者 /etc/xinetd.d/cups-lpd
    • 或者 /etc/inetd.conf 中的 cups-lpd 行
    • 或者 systemd /usr/lib/systemd/system/cups-lpd* 单元文件

PPD 文件

什么是 PPD 文件以及它是如何工作的?

参见 Concepts printing 上的“PPD 文件:特定于打印机的选项”。

对于 PostScript 打印机,PPD 文件包含特定于打印机的选项(仅此而已)以及必须发送到 PostScript 解释器以激活特定选项的相应 PostScript 代码片段。

对于非 PostScript 打印机,PPD 文件还包含必须使用哪个打印机驱动程序程序以及可用选项的信息。如果多个驱动程序可以用于给定的打印机,则有多个 PPD 文件可用。

根据为特定打印作业设置的特定于打印机的选项(例如,“-o PageSize=A4”),过滤器系统从 PPD 文件中读取合适的 PostScript 代码片段,并将它们插入到 PostScript 数据流中。

PPD 文件中选项条目的语法(带有两个示例条目)如下

* 主关键字 选项关键字/翻译字符串 " PostScript 调用值 "
*PageSize Letter/letter paper "<</PageSize[612 792]/ImagingBBox null>>setpagedevice"
*PageSize A4/A4 paper "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"

更多信息可在“Adobe PostScript 打印机描述文件格式规范,版本 4.3”中找到。

详细信息

/etc/cups/ppd/

  • 此目录包含 cupsd 实际使用的 PPD 文件。
  • PPD 文件中的条目(尤其是“*Default...”条目)可能与配置队列时指定的原始 PPD 文件中的条目不同。

/usr/share/cups/model/

  • 此目录包含用于设置新打印队列的原始 PPD 文件。参见 Concepts printing 上的“openSUSE 打印机驱动程序软件包”哪些软件包提供哪种 PPD 文件。
  • 可以将其他 PPD 文件(例如来自打印机制造商的 PPD 文件)复制到此目录,以便使它们可用于打印机配置工具。

OpenPrinting/LinuxPrinting.org 打印机数据库

过滤器(包括驱动程序)

通常,“过滤器”是指将输入数据转换为输出数据的程序,而“驱动程序”是指特定于设备型号的软件和数据。

过滤器系统做什么以及它是如何工作的?

过滤器系统的主要目的是通过几个步骤将打印作业的原始数据(ASCII、PostScript、PDF)转换为特定于打印机的数据(PostScript、PCL、ESC/P)。

通常,最后一步是一个程序,即打印机驱动程序,它输出最终的特定于打印机的数据,请参阅“打印机驱动程序:使打印机打印”在 Concepts printing

每个步骤都由一个分离的过滤程序完成,这些过滤程序按顺序运行,就像传统的 Unix 管道一样:原始打印作业数据是第一个过滤程序的输入,其输出通过管道作为第二个过滤程序的输入,依此类推,直到最后一个过滤程序的输出通过管道作为输入发送到 CUPS 后端,最终将特定于打印机的数据发送到打印机(请参阅后续关于“后端”的部分)。

针对特定打印机模型在特定 Linux 系统上过滤特定打印作业的实际过程取决于各种条件,请参阅“背景信息”在 SDB:How to Report a Printing Issue

特别是,过滤对于传统的打印数据格式 PostScript 和最近的打印数据格式 PDF 是不同的,请参阅“常见的打印数据格式”在 Concepts printing

此外,实际过滤取决于所使用的打印机驱动程序的类型。

以下是一个具体的例子,说明了当使用包含在 Ghostscript 中的打印机驱动程序时,传统打印数据格式 PostScript 的过滤工作方式。在这种情况下,过滤通过以下步骤进行

1) 将原始数据转换为 PostScript。

1a) 确定原始数据的 MIME 类型

这会根据 /usr/share/cups/mime/mime.types 或 /etc/cups/mime.types 进行。

1b) 转换为 PostScript(如果尚未是 PostScript)

如果原始数据的 MIME 类型不是“application/postscript”,则根据 /usr/share/cups/mime/mime.convs 或 /etc/cups/mime.convs 转换为 PostScript。

特别是,MIME 类型为“text/plain”的原始数据使用 /usr/lib/cups/filter/texttops 转换为 PostScript。

自 CUPS 1.3.4 以来,仅支持 UTF-8 文本(包括 7 位 ASCII 文本)。不再支持 ISO-8859 编码的文本。原因是无法自动检测编码,因此 CUPS 无法以可靠的方式处理任意编码的“纯文本”文件,请参阅 SDB:Plain Text versus Locale。要打印非 UTF-8 文本,必须先将其从其编码转换为 UTF-8,然后将其发送到 CUPS 服务器。要打印 ISO-8859-1 文本文件,可以使用

iconv -f ISO-8859-1 -t UTF-8 filename | lp -d queue

有关 iconv 的信息,请参阅“iconv --help”。

PDF 或图形文件(JPEG、PNG 等)的打印方式与以前相同。

2) 将 PostScript 调用值插入到 PostScript 数据流中。

这会根据 /usr/share/cups/mime/mime.convs 或 /etc/cups/mime.convs 中的以下行进行

输入 MIME 类型 输出 MIME 类型 成本 过滤器
application/postscript application/vnd.cups-postscript 66 pstops


3) 将 PostScript 数据转换为特定于打印机的数据。

如果使用非 PostScript 打印机和 Foomatic PPD 文件,则 PostScript 数据将根据 Foomatic(版本 3.x)PPD 文件中的以下行转换为特定于打印机的数据

主关键字 输入 MIME 类型 成本 过滤器
*cupsFilter "application/vnd.cups-postscript foomatic-rip"


如果使用非 PostScript 打印机和 Foomatic PPD 文件,则 foomatic-rip 与 Ghostscript 一起充当 PostScript 解释器。

foomatic-rip 按照以下步骤将 PostScript 数据转换为特定于打印机的数据

3a) 构建 Ghostscript 命令

foomatic-rip 根据为相应的打印作业设置的特定于打印机的选项构建带有所需 Ghostscript 打印机驱动程序和附加参数的 Ghostscript 命令。

在某些情况下,在 Ghostscript 命令之后引入了一个后置过滤器(通过管道)。例如,对于某些 PCL 打印机,通过更改 PCL 数据流(例如,通过“perl -e”)实现某些选项。

3b) 运行 Ghostscript 命令(或管道)

foomatic-rip 执行 Ghostscript 命令。

如果使用非 Foomatic PPD 文件(例如,来自 /usr/share/cups/model/gutenprint 或 /usr/share/cups/model/stp 的 Gutenprint/Gimp-Print PPD 文件),则非 PostScript 打印机的 PPD 文件中的“*cupsFilter”条目可能如下所示

*cupsFilter: "application/vnd.cups-raster 100 rastertogutenprint"

*cupsFilter: "application/vnd.cups-raster 100 rastertoprinter"

通过 /usr/share/cups/mime/mime.convs 或 /etc/cups/mime.convs 中的匹配条目,结果是不同的过滤过程。在这种特定情况下,/usr/lib/cups/filter/rastertogutenprint 或 /usr/lib/cups/filter/rastertoprinter 是打印机驱动程序程序。

有关过滤器的更多常规信息,请参阅 man 页面“man 7 filter”。有关过滤器的更具体信息,请参阅支持数据库文章 SDB:Using Your Own Filters to Print with CUPS

详细信息

/usr/lib/cups/filter/

此目录包含 CUPS 过滤器系统使用的各种过滤器程序,如果配置相应的队列时指定了 PPD 文件。

  • /usr/lib/cups/filter/*tops(例如,/usr/lib/cups/filter/texttops)用于将原始数据(例如,“text/plain”)转换为 PostScript。
  • /usr/lib/cups/filter/pstops 用于插入 PostScript 调用值,并在必要时重新格式化 PostScript 数据(例如,缩小并在一页上打印两页)。
  • /usr/lib/cups/filter/foomatic-rip 用于将 PostScript 数据转换为特定于打印机的数据(例如,PCL 或 ESC/P)。

/etc/cups/interfaces/

自 CUPS 2.2.0 以来不兼容的更改:不再存在目录 /etc/cups/interfaces,因为自 CUPS 2.2.0 以来,出于安全原因不再支持所谓的“System V 风格的接口脚本”(请参阅 CUPS 中的“CHANGES”文件)。

在 CUPS < 2.2.0 之前,/etc/cups/interfaces 目录包含 CUPS 在配置相应队列时指定“System V 风格的接口脚本”而不是 PPD 文件时使用的过滤器。 “System V 风格的接口脚本”是一个单独的过滤器程序或过滤器脚本,它为原始打印数据可能发送的所有数据格式生成特定于打印机的数据。有关“System V 风格的接口脚本”的更多信息,请参阅支持数据库文章“使用您自己的过滤器进行 CUPS 打印”:SDB:Using Your Own Filters to Print with CUPS

"raw"

如果在配置相应队列时未指定 PPD 文件或“System V 风格的接口脚本”,则不会进行任何过滤。原始打印数据将直接从后端发送到接收者(通常是打印机),而无需任何更改(以“原始”形式)。无法转换换行符(例如,LF -> CR+LF)或附加换页符。在 CUPS < 2.2.0 之前,可以使用“System V 风格的接口脚本”来实现此目的。

后端

什么是 CUPS 后端以及它是如何工作的?

通常,后端从过滤器接收特定于打印机的数据,并将其转发到打印机或其他接收者。

后端和过滤器之间的区别如下

  • 一个后端,但通常有几个过滤器(称为“过滤器链”或“过滤器管道”)被激活来处理打印作业。例外情况:“System V 风格的接口脚本”(一个过滤器)和“原始”打印(没有过滤器)。
  • 在处理链/管道中,后端始终是处理打印作业执行的最后一个程序。

当后端完成时,打印系统认为打印作业已完成。后端在完成向接收者的传输时完成。如果接收者处的进一步处理失败(例如,如果打印机无法打印特定于打印机的数据),打印系统将不会注意到这一点。

如果向接收者的传输失败(通常在后端多次尝试后),后端将向打印系统(更准确地说,向 cupsd)报告错误。后端决定在报告传输失败之前应该进行多少次尝试。由于进一步的尝试将是徒劳的,cupsd 会禁用受影响队列上的打印。在消除问题原因后,系统管理员必须使用 /usr/bin/enable(对于 CUPS 1.1 - 即,直到 Suse Linux 10.1)或 cupsenable(自 CUPS 1.2 以来 - 即,自 openSUSE 10.2 以来)重新启用打印。

有关后端的更多信息,请参阅 man 页面“man 7 backend”以获取后端特定的信息,以及“man 7 filter”以获取有关过滤器的常规信息(后端是一种特殊的过滤器)。有关后端的更具体信息,请参阅支持数据库文章 SDB:Using Your Own Backends to Print with CUPS

详细信息

/usr/lib/cups/backend/

此目录包含各种后端。

必须根据如何从运行 CUPS 系统的主机访问打印机以及接收者的类型来使用合适的后端。

后端可以发送数据的目标可以是任何可用的后端 URI(统一资源标识符)。“DeviceURI”条目中的第一部分 /etc/cups/printers.conf 确定后端,其他条目作为后端的参数。

后端 URI 语法 示例 URI
parallel parallel:/dev/lp* parallel:/dev/lp0
usb(传统) usb:/dev/usb/lp* usb:/dev/usb/lp0
usb(新) usb://<make>/<model>?serial=<number> usb://ACME/FunPrinter%201000?serial=A1B2C3
ipp ipp://<ipp-server.domain>/printers/<queue> ipp://cups-server.domain/printers/funprinter1000
lpd lpd://<lpd-server.domain>/<queue> lpd://192.168.101.202/lpt1
socket socket://<host.domain>:<port> socket://192.168.101.202:9100
smb 请参阅 man 页面 smbspool(8) smb://user:password@workgroup/smb-server/share

如果 smb 后端需要“user”和“password”,则 /etc/cups/printers.conf 文件的所有者、组和访问权限必须足够严格。使用命令“lpstat -v”时不会显示“user”和“password”规范。

每个后端也可以直接寻址。例如,“parallel”和“usb”后端会返回连接打印机的 IEEE-1284 标识。

root@host# /usr/lib/cups/backend/parallel
direct parallel:/dev/lp0 "ACME FunPrinter 1000" "Parallel Port #1"
root@host# /usr/lib/cups/backend/usb
direct usb://ACME/USB%20Printer?serial=1234 "ACME USB Printer" "USB Printer #1"
direct usb:/dev/usb/lp1 "Unknown" "USB Printer #2"
...

对于较旧的 CUPS 版本,在启动时,cupsd 会连续执行 /usr/lib/cups/backend/ 中的所有后端,以确定哪些后端可在各自的系统上使用。只有可用的后端才能用于队列的配置。可以使用“lpinfo -v”显示可用的后端。对于如今的 CUPS 版本,cupsd 本身不会运行,而是单独的 cups-deviced 运行,它还会在运行“lpinfo -v”命令时执行 /usr/lib/cups/backend/ 中的所有后端(并且 cups-driverd 在运行“lpinfo -m”命令时运行,请参阅“man cups-deviced”和“man cups-driverd”)。

命令行工具

有关命令行工具的一般信息

如果提供了合适的命令行工具,请不要手动编辑 /etc/cups/ 中的配置文件。

例外情况:/etc/cups/cupsd.conf(以及自 CUPS 1.6 以来,/etc/cups/cups-files.conf)

对 /etc/cups/cupsd.conf(以及自 CUPS 1.6 以来,/etc/cups/cups-files.conf)进行修改后,必须重新启动 cupsd 才能使其使用修改后的配置。

不要手动更改 CUPS 轮询文件(在 /var/spool/cups/ 中)。使用 CUPS 命令行工具。

切勿在 cupsd 运行时手动更改 CUPS 文件。

相反,CUPS 命令行工具仅提交一个任务,即让 cupsd 正确执行它。

理由

CUPS 文件既不会被重新读取,也不会在任何情况下立即更新。相反,cupsd 会将大量信息保存在内存中,并在或多或少任意时间将其写回文件(请参阅 cupsd 配置指令“DirtyCleanInterval”)。

例如,要清理所有打印队列,请运行“cancel -a”(或自 CUPS 1.7 以来“cancel -a -x”),这将完全删除所有现有(旧)打印作业(包括作业历史记录)在所有打印队列中。

除非您确切知道自己在做什么,否则请勿将配置文件从其他系统复制到您的系统。而是使用命令行工具。

例如,要在多个机器上设置相同的队列(例如,对于备份服务器),不要复制 /etc/cups/printers.conf 和 /etc/cups/ppd/*,而是在脚本中编写相应的命令(通常是一系列 lpadmin 命令),并在各个机器上运行该脚本。这样,任何错误消息都将在各自的机器上显示(例如,如果机器上没有 PPD 文件或后端不可用或未准备好使用)。此外,使用这样的脚本,您可以获得某种备份加日志文件,从而可以随时通过运行该脚本来恢复这些设置。

如果您不确定哪个图形工具最适合某些特殊配置或打印队列维护操作,请使用命令行工具。

在许多情况下,选项的顺序很重要。阅读 man 页面。例如,以下命令都不同

  lpadmin -E -p queue,
  lpadmin -p queue -E
  lpadmin -E -p queue -E

详细信息

用于创建或编辑队列的命令行工具

如何完全符合 CUPS 设置打印队列

  1. 从 cupsd 检索自动检测到的打印机及其正确的匹配 DeviceURI:以 root 身份运行“lpinfo -l -v”
  2. 从 cupsd 检索可用的打印机驱动程序描述:以 root 身份运行“lpinfo -l -m”
  3. 从第一个列表中选择一个打印机/DeviceURI,从第二个列表中选择一个打印机驱动程序,并设计一个合适的队列名称。
  4. 设置队列:以 root 身份运行“lpadmin -p queue_name -v DeviceURI -m printer_driver -E”或“lpadmin -p queue_name -v DeviceURI -P /usr/share/cups/model/printer_driver -E”

不需要重新启动 cupsd 来添加、修改或删除队列(只有 cupsd 本身的配置更改才需要重新启动)。

使用 PPD 文件创建常规队列的示例

root@host# lpadmin -h localhost -p funprinter1000 -v parallel:/dev/lp0 -P /usr/share/cups/model/Postscript.ppd.gz -E

创建本地“原始”队列的示例,该队列仅将打印作业数据转发到远程 cups 服务器上的队列(请参阅上面的“原始”和“/usr/lib/cups/backend/”部分)

root@host# lpadmin -h localhost -p funprinter1000forwarding -v ipp://cups-server.domain/printers/funprinter1000 -E

使用以下命令检查创建的内容

user@host$ lpstat -h localhost -a funprinter1000 -p funprinter1000 -v funprinter1000
funprinter1000 accepting requests since Jan 01 00:00
printer funprinter1000 is idle.  enabled since Jan 01 00:00
device for funprinter1000: parallel:/dev/lp0

或者,查看 /etc/cups/printers.conf

<Printer funprinter1000>
Info funprinter1000
DeviceURI parallel:/dev/lp0
State Idle
Accepting Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
</Printer>

或者通过 Web 前端查询系统:https://:631/printers/funprinter1000

编辑队列(例如,更改描述和位置)

root@host# lpadmin -h localhost -p funprinter1000 -D "ACME FunPrinter 1000" -L "2. floor: room 3"

显示 /etc/cups/ppd/funprinter1000.ppd 中特定于打印机的选项及其默认设置(前提是队列是用 PPD 文件设置的)

user@host$ lpoptions -h localhost -p funprinter1000 -l
Resolution/Output Resolution: 150dpi *300dpi 600dpi 1200dpi 2400dpi
PageSize/Media Size: Letter Legal Executive *A4 A5
...

输出的语法如下

main-keyword/translation-string: option-keyword option-keyword option-keyword ...

默认设置以在“option-keyword”前面带有 * 标记。

更改 /etc/cups/ppd/funprinter1000.ppd 中特定于打印机的默认设置(前提是队列是用 PPD 文件设置的)

root@host# lpadmin -h localhost -p funprinter1000 -o Resolution=600dpi -o PageSize=Letter

语法如下

lpadmin -h localhost -p queue -o main-keyword1=option-keyword1 -o main-keyword2=option-keyword2 ...

不要使用 lpoptions 来实现此目的。请参阅支持数据库文章 Print Settings with CUPS。普通用户可以使用 lpoptions 将他们的个人默认设置保存在 ~/.cups/lpoptions 中(自 CUPS 1.2 / openSUSE 10.2 以来,在 CUPS 1.1 中为 ~/.lpoptions)。有关此信息,请参阅同一支持数据库文章。

使用 "accept" 和 "reject" 来接受和拒绝队列中的打印任务。

使用 /usr/bin/enable ("enable" 是 bash 内置命令) 或 /usr/sbin/cupsenable 和 "disable" 或 /usr/sbin/cupsdisable 来启用和禁用队列中的打印 (例如,为了避免在打印机上进行维护工作时丢失打印任务)。

删除队列

root@host# lpadmin -h localhost -x funprinter1000

日常使用的命令行工具

避免使用 BSD 类型的命令 (lpr, lpq, lprm),因为它们仅支持有限数量的通用选项。 而是使用 System V 类型的命令 (lp, lpstat, cancel)。

使用 lpoptions 将个人打印机特定的选项设置保存在 ~/.cups/lpoptions 中 (从 CUPS 1.2 / openSUSE 10.2 开始,在 CUPS 1.1 中是 ~/.lpoptions)。 示例

user@host$ lpoptions -o Resolution=1200dpi -p funprinter1000

可用的打印选项在您的本地机器上运行的 CUPS web 界面中的 "Getting Started" 部分的 "Command-Line Printing and Options" 页面上描述,网址为 https://:631,或者查看 CUPS.org 上的实际使用的 CUPS 版本的 "Documentation",网址为 http://www.cups.org

cupsd Web 前端

网络中的每个 cupsd 都有一个 HTTP web 前端。 本地运行的 cupsd 的 URL 是 https://:631,远程 cupsd 的 URL (在 "host.domain" 上) 是 http://host.domain:631,前提是远程主机上的远程 cupsd 允许访问。

详细信息

在日常操作中,web 前端通常是关于队列和打印作业的最佳信息来源。 例如,https://:631/printers/ 提供本地 cupsd 所有队列的概述。

web 前端是获取有关相应 cupsd (cupsd 版本) 文档的最佳方式。 例如,本地安装的 CUPS 版本的文档可在 https://:631 处获得,远程服务器上安装的 CUPS 的文档可在 http://host.domain:631 处获得,前提是远程服务器允许访问。

甚至可以通过 web 前端访问 /etc/cups/ppd/ 中的 PPD 文件。 例如,本地主机上队列 "funprinter1000" 的 PPD 文件 (/etc/cups/ppd/funprinter1000.ppd) 可以通过 URL https://:631/printers/funprinter1000.ppd 访问,相应地,"host.domain" 上的 "queue" 的 PPD 文件可以通过 URL http://host.domain:631/printers/queue.ppd 访问,前提是远程主机允许访问。

在网络中配置 CUPS <= 1.5

CUPS >= 1.6 具有重大不兼容更改

升级到 CUPS >= 1.6 后,网络中的打印将不再像 CUPS 1.5 那样工作。

有关 CUPS 1.6 之后的新内容,请参阅 https://www.cups.org/blog.html

有关 CUPS 1.6 之后的不兼容更改的详细信息,请参阅 https://bugzilla.opensuse.org/show_bug.cgi?id=735404 并遵循其中的链接。

从 Mac OS X 10.8 "Mountain Lion" 版本开始,它使用 CUPS 1.6 (但 OS X 10.7 "Lion" 使用 CUPS 1.5)。 似乎 OS X 10.8 客户端需要一个支持 OS X 10.8 客户端通过网络默认打印方式的 CUPS 1.6 服务器。 因此,使用最新 Mac OS X 10.8 客户端的网络可能需要 CUPS 1.6 服务器。

需要向后兼容性的用户可以在一台服务器上运行 CUPS 1.5,而需要 CUPS >= 1.6 中新功能的用户可以另外在另一台服务器上运行 CUPS >= 1.6。

特别是要注意 CUPS >= 1.6 通常需要 OpenPrinting.org 提供的 cups-filters 软件的过滤器。

CUPS <= 1.5 用于网络打印的固有设计

CUPS 网络服务器 (进行排队和过滤的主机)

  • CUPS 网络服务器的 cupsd 将其队列的信息发送到 IP 地址列表 (主机地址和/或广播地址)。 默认设置是一个空列表。
  • 传输在预设的时间间隔后重复。 默认设置是 30 秒。

客户端 (仅将打印作业发送到服务器的主机)

  • 默认情况下,cupsd 侦听来自服务器的信息。 因此,每个客户端上都应运行一个本地 cupsd。 有一个接受信息的服务器列表。 默认情况下,接受来自所有服务器的信息。
  • 如果在设定的时间间隔内没有收到关于队列的新信息,客户端会删除关于特定队列的信息。 默认设置是 300 秒。

这样,服务器的队列就直接在客户端上可用。 客户端上的用户可以浏览各个服务器上的队列。 因此,整个东西被称为 "Browsing" (浏览)。

默认情况下激活浏览。 接受所有传入的浏览信息,但不发送任何浏览信息 (见上文)。

配置 CUPS <= 1.5 服务器

  1. 为与服务器关联的打印机配置打印队列。
  2. 允许客户端访问队列。
  3. 激活将浏览信息发送到客户端。

应使用子网来简化配置。 如果使用子网,则只需将浏览信息发送到固定的广播地址,而不必不断维护单个主机地址的列表。

对服务器的队列的访问是独立处理的,无论服务器将浏览信息发送到哪些主机。 服务器可以授予网络中的所有客户端访问其队列的权限,同时仅将浏览信息发送到某些客户端。 但是,服务器不应将任何浏览信息发送到无法访问其队列的客户端。

在大型公司中,不可能只有一台大型服务器,将某些队列的浏览信息发送到某个部门或建筑物中的客户端,并将其他队列的浏览信息发送到其他客户端。

为此需要多个服务器 (每个部门或建筑物一个)。

详细信息

配置 CUPS <= 1.5 服务器上的打印队列

属于服务器的打印机是服务器上进行过滤的打印机。

I) 配置打印机,以便打印在服务器上工作。

为与服务器关联的打印机设置打印队列。

验证当普通用户直接从服务器打印时,打印是否正常工作。 如果出现问题,请检查服务器上的 CUPS 调试消息,如下所示。

II) 允许客户端访问队列。

手动更改 /etc/cups/cupsd.conf 或使用 YaST。 从 openSUSE 11.1 开始,在 YaST 中使用 "Share Printers" 对话框,请参阅 YaST Printer

首先让 cupsd 侦听网络

默认情况下,从 CUPS 1.2 开始 (从 openSUSE 10.2 开始),cupsd 仅侦听 /etc/cups/cupsd.conf 中的内部 ("localhost") 网络接口 (和一个 Unix 域套接字)。

Listen localhost:631
Listen /var/run/cups/cups.sock

对于 CUPS 1.2 (及更高版本) 网络服务器,您必须将其更改为也侦听外部网络。 添加形式为 "Listen IP.of.your.server" 的条目。

如果 CUPS 服务器可从任何不受信任的网络访问,请确保使用防火墙保护您的服务器。

然后允许客户端访问服务器

/etc/cups/cupsd.conf 中的默认设置如下

<Location />
Order allow,deny
Allow 127.0.0.2
</Location>

可以无条件地允许从 "localhost" 127.0.0.1 访问,并且可以为服务器的主机名分配 127.0.0.2,以便也允许通过服务器的主机名访问。

要允许来自整个本地网络中的所有主机的访问,请插入行

Allow @LOCAL

此设置允许所有 LOCAL 主机访问 cupsd。 LOCAL 主机是指其 IP 地址与非 PPP 接口关联 (更准确地说,其 IFF_POINTOPOINT 标志未设置) 且其 IP 地址与 CUPS 服务器相同的网络中的主机。 这意味着通常连接到普通调制解调器的 "Internet" 网络接口被排除在外。 但是,如果它连接到电缆调制解调器,则它不是点对点接口,因此在这种情况下无法使用 @LOCAL。

要允许访问特定的主机或网络,请插入如下行

Allow 192.168.100.1
Allow 192.168.200.0/255.255.255.0

我们建议使用 IP 地址而不是名称。

与较旧的 SUSE LINUX 版本相比的差异

从 SUSE LINUX 9.0 到 SUSE LINUX 10.1,/etc/cups/cupsd.conf 中的默认设置是

BrowseAllow @LOCAL
.
.
.
<Location />
...
Allow @LOCAL
</Location>

此设置允许所有 LOCAL 主机访问 cupsd,并且立即拒绝来自所有其他主机的包。

到 SUSE LINUX 10.1 为止,我们提供了 CUPS 1.1,从 openSUSE 10.2 开始,我们提供了 CUPS 1.2,它与 CUPS 1.1 不完全向后兼容。

因此,在更新的情况下,建议不要使用来自 CUPS 1.1 安装的过时的 cupsd.conf,而是从我们的 CUPS 1.2 (或更高版本) RPM 的原始 cupsd.conf 开始。

例如,RunAsUser 不再受支持,因此从 openSUSE 10.2 / CUPS 1.2 开始,cupsd 以 root 用户身份运行,因此我们回到了其默认的 "基本身份验证" 通过系统用户和系统密码 (在 /etc/shadow 中),因此再次可以使用 "root" 进行身份验证并使用通常的 root 系统密码。

III) 激活将浏览信息发送到客户端。

在 /etc/cups/cupsd.conf 中,设置条目 "BrowseAddress @LOCAL",以便将浏览信息发送到所有 LOCAL 主机,或者插入形式为 "BrowseAddress client.host.IP.address" 或 "BrowseAddress network.broadcast.IP.address" 的条目。

将浏览信息发送到客户端是可选的

  • 如果省略,客户端将不会自动接收服务器上队列的信息。
  • 尽管如此,由于上一步,客户端能够寻址服务器的队列。

特别是在大型网络中,可能有意义的是授予所有客户端访问权限,但仅将浏览信息发送到某些客户端 (例如,仅发送到与服务器位于同一部门或建筑物中的客户端)。

IV) 重启 cupsd。

如果不起作用,获取 CUPS 调试消息

CUPS 日志文件 /var/log/cups/error_log 包含可能对故障排除有用的日志消息 - 但默认情况下不包含调试消息。

要获取 CUPS 调试消息,请参阅 SDB:How to Report a Printing Issue 中的 "Usually provide CUPS debug messages" 部分。

如果您有 CUPS 调试消息,但这些消息无法帮助您找到根本原因,您可以按照 SDB:How to Report a Printing Issue 中描述的方式寻求帮助。

配置 CUPS <= 1.5 客户端

推荐

  1. 激活 /etc/init.d/cups,以便在客户端启动时启动 cupsd。
  2. 启动 cupsd。

从 SUSE LINUX 9.1 开始,默认情况下会发生这种情况。 如果需要,可以使用 YaST Runlevel Editor 或 insserv 来完成此操作。 在正常情况下,您不应该配置其他任何内容,尤其是

  • 客户端上的本地队列和
  • 客户端上 cupsd 的默认设置不作更改。

配置 CUPS <= 1.5 客户端的特殊情况

可选

在 /etc/cups/cupsd.conf 中插入形式为 "BrowseAllow IP.of.desired.server" 和 "BrowseDeny IP.of.unwanted.server" 的条目,以便拒绝来自不受欢迎的服务器的所有类型的包 (包括浏览信息)。 我们建议使用 IP 地址而不是名称。 在某些情况下,调整 "BrowseOrder" 条目可能很有用。

如果有不发送任何浏览信息的服务器,但其队列可以访问 (例如,其他部门或建筑物中的服务器),您可能希望轮询服务器的浏览信息。 为此,在 /etc/cups/cupsd.conf 中为每个服务器插入形式为 "BrowsePoll IP.of.the.server:631" 的条目。 我们建议使用 IP 地址而不是名称。 默认情况下,服务器上的端口是 631。 重启 cupsd 后,将为每个 "BrowsePoll" 条目启动一个 cups-polld。

手动更改 /etc/cups/cupsd.conf 或使用 YaST。 从 openSUSE 11.3 开始,在 YaST 中使用 "Print via Network" 对话框,请参阅 YaST Printer

如果通常不需要浏览

在 /etc/cups/cupsd.conf 中设置 "Browsing Off"。 这并不意味着无法再访问服务器上的队列。 仍然可以使用命令行工具等实用程序;但是,必须显式指定服务器 (通常使用 "-h" 选项,请参阅手册页)。

仅客户端配置

如果通常不需要浏览,则在客户端上运行 cupsd 没有意义。在这种情况下,应使用仅客户端的配置。可以按照以下说明手动设置,或使用 YaST。从 openSUSE 11.1 开始,YaST 使用“通过网络打印”对话框,请参阅 YaST Printer

  1. 停止并禁用 cupsd(使用 YaST 运行级别编辑器或 insserv)。
  2. 在 /etc/cups/client.conf 中,插入格式为“ServerName IP.of.the.server”的条目。

在 /etc/cups/client.conf 中,这样的条目不应与正在运行的本地 cupsd 共存。由于只能有一个条目,应输入首选服务器。要访问不同的服务器,必须在使用命令行工具时显式指定服务器(选项“-h),或相应地设置环境变量 CUPS_SERVER。某些应用程序会忽略“ServerName”条目。在这种情况下,设置 CUPS_SERVER 可能会有所帮助,或者可以在应用程序中显式指定服务器(例如,在打印命令中使用选项“-h”)。

最小客户端安装

解决 CUPS 服务器的最低标准要求是安装“cups-libs”和“cups-client”软件包。在这种情况下,可以使用命令行工具来寻址服务器。

解决 CUPS 服务器的绝对最低要求是仅安装“cups-libs”软件包。在这种情况下,只有直接使用 CUPS 库的应用程序程序才能打印。

关于防火墙

如果 CUPS 服务器和客户端系统位于内部网络中,并且您信任内部网络中的所有内容,则您的网络接口必须设置为“内部区域”。

在受信任的内部网络中,将网络接口设置为不受信任的“外部区域”(默认设置为安全)是没有意义的。

特别是,不要为不受信任的“外部区域”禁用 CUPS 防火墙保护(即,对于使用 TCP 端口 631 和 UDP 端口 631 的 IPP)。

请参阅支持数据库文章 CUPS and SANE Firewall settings

允许普通用户执行打印机管理任务

从 openSUSE 10.2 / CUPS 1.2 开始,使用原始 CUPS 1.2(或更高版本)cupsd.conf 文件(支持 CUPS 操作策略),您可以按如下方式允许普通用户执行打印机管理任务

<Policy default>
...
<Limit ... CUPS-Add-Modify-Printer ...>
Require user @SYSTEM normal-user

将“normal-user”替换为系统用户名(即 /etc/passwd 中的用户名),该用户应被允许执行打印机管理任务,然后重新启动 cupsd。

有关“操作策略”的详细信息,请参阅 https://www.cups.org/doc/policies.html

请记住,允许执行打印机管理任务的用户可以随意更改打印队列。例如,他可以让(可能机密的)打印作业像往常一样打印(这样就很难发现背叛),但同时将打印内容副本发送到任何外部目的地。

在此背景下,一些通用的安全建议

当 root 允许普通用户执行系统管理任务时,特别是当 root 允许普通用户管理系统进程(即以 root 身份运行的进程,如 cupsd)时,这种或那种特权提升将是可能的。

只有不会滥用其权限的可信用户才会被允许执行特定的系统管理任务。

参见

Portal:Printing

SDB:安装打印机

SDB:Purchasing a Printer and Compatibility

SDB:Printing via TCP/IP network

SDB:CUPS and SANE Firewall settings

YaST Printer