CUPS/打印机共享

来自 ArchWiki

本文包含关于从 GNU/Linux 系统共享打印机的说明。

客户端支持
协议 Linux Windows macOS
发现 (DNS-SD/mDNS) CUPSAvahi Windows 10 起原生支持 Bonjour
Internet 打印协议 CUPS 控制面板 > 程序 > 启用或关闭 Windows 功能 > 打印和文档服务 > Internet 打印客户端 原生支持
SMB 共享打印机 SambaCUPS 原生支持 原生支持
Line Printer Daemon 协议 CUPS 控制面板 > 程序 > 启用或关闭 Windows 功能 > 打印服务 >
LPD Print ServiceLPR Port Monitor
原生支持

创建多打印机类

在 CUPS 中,类是一组打印机,对客户端来说它们就像一台打印机。当客户端选择打印到类时,CUPS 会选择组中的任何打印机来接受打印作业。当必须移除类中的一台打印机时,这可能特别有用。如果将其从类中排除,最终用户不会注意到任何变化,因为打印作业将被排队到类中的另一台打印机。创建和管理类可以通过 CUPS Web GUI 完成。

打印机共享

本文或本章节需要扩充。

原因: 列出需要在防火墙中打开的端口。[1] (在 Talk:CUPS/Printer sharing 中讨论)

DNS-SD 广播

要通过 DNS-SD/mDNS (Apple 世界中的 Bonjour) 向网络广播打印机,必须在服务器上安装并运行 Avahi

要启用它,可以在 Web 界面中选择共享连接到此系统的打印机,或者手动在 /etc/cups/cupsd.conf 中设置 Browsing Yes

/etc/cups/cupsd.conf
...
Browsing Yes
...

之后重启 cups.service

请注意,打印服务器上的“浏览”与远程联网主机上的“浏览”是不同的。在打印服务器上,cupsd 提供 DNS-SD 协议支持,avahi-daemon 负责广播。除非还广播旧的 CUPS 协议,或者打印服务器也在“浏览”其他联网打印机,否则打印服务器上不需要 cups-browsed 服务。在远程联网主机上,需要 cups-browsed 服务来“浏览”打印服务的网络广播,并且运行 cups-browsed 也会自动启动 cupsd

当插入 USB 打印机时,cups.service 服务将自动启动,但这可能不适用于其他连接类型。如果 cups.service 未运行,avahi-daemon 不会广播打印服务,因此在这种情况下,必须修改 systemd 单元服务文件以在启动时启动,然后必须使用新的依赖项再次“启用/安装”该服务。为此,编辑 服务文件 [Install] 部分,添加 WantedBy=default.target 依赖项,然后启用启动 cups.service 服务。

通过 Internet 打印协议共享

可以使用 Web 界面或手动编辑 /etc/cups/cupsd.conf 来配置服务器。

打开服务器的 Web 界面,选择管理选项卡,在服务器标题下找到并启用“共享连接到此系统的打印机”选项。单击更改设置按钮保存更改。服务器将自动重启。

在服务器计算机(直接连接到打印机的计算机)上,通过修改 location 指令来允许访问服务器。例如

/etc/cups/cupsd.conf
<Location />
    Order allow,deny
    Allow localhost
    Allow 192.168.0.*
</Location>
...

还要确保服务器正在监听客户端将使用的 IP 地址

/etc/cups/cupsd.conf
...
Listen <hostname>:631
...

还有更多配置可能性,包括自动方法,这些方法在 Using Network Printerscupsd.conf(5) 中有详细描述。

进行任何修改后,重启 cups.service

如果 CUPS 使用套接字激活启动,请为 cups.socket 创建一个 drop-in snippet,以便套接字激活也适用于远程连接

/etc/systemd/system/cups.socket.d/override.conf
[Socket]
ListenStream=631

通过 Samba 共享

Samba 是 Windows 文件和打印机共享协议的实现,甚至是最古老的协议。

要在 Linux 服务器上配置 Samba,请编辑 /etc/samba/smb.conf 文件以允许访问打印机。文件 smb.conf 可以如下所示

/etc/samba/smb.conf
[global]
...
printing = CUPS
...

[printers]
    comment = All Printers
    path = /var/spool/samba
    browseable = yes
    # to allow user 'guest account' to print.
    guest ok = no
    writable = no
    printable = yes
    create mode = 0700
    write list = root @adm @wheel yourusername

这应该足以共享打印机,但添加单独的打印机条目可能是可取的

/etc/samba/smb.conf
[ML1250]
    comment = Samsung ML-1250 Laser Printer
    printer = ml1250
    path = /var/spool/samba
    printing = cups
    printable = yes
    user client driver = yes
    # to allow user 'guest account' to print.
    guest ok = no
    writable = no
    write list = root @adm @wheel yourusername
    valid users = root @adm @wheel yourusername

请注意,这假设配置已完成,以便用户必须拥有有效帐户才能访问打印机。要拥有公共打印机,请将 guest ok 设置为 yes,并删除 valid users 行。要添加帐户,请设置一个常规 GNU/Linux 帐户,然后在服务器上设置 Samba 密码。请参阅 Samba#User management

之后,重启 smb.servicenmb.service

有关更多详细信息,请参阅 Samba 的文档 Setting up Samba as a Print Server

通过 Line Printer Daemon 协议共享

警告: cups-lpd 不会根据 /etc/cups/cupsd.conf 中的设置执行任何访问控制。因此,在您的服务器上运行 cups-lpd 将允许您网络上的任何计算机(甚至可能是整个互联网)打印到您的服务器。

启用启动 cups-lpd.socket

远程管理

一旦服务器按照 #打印机共享 中的描述设置完成,也可以将其配置为可以远程管理。使用与 #通过 Internet 打印协议共享 中描述的相同语法,将允许的主机添加到 /etc/cups/cupsd.conf 中的 <Location /admin> 块中。请注意,可以授予三个级别的访问权限

<Location />           #access to the server
<Location /admin>	#access to the admin pages
<Location /admin/conf>	#access to configuration files

要授予远程主机对这些级别之一的访问权限,请在该级别的部分中添加 Allow 语句。Allow 语句可以采用以下一种或多种形式

Allow from all
Allow from host.domain.com
Allow from *.domain.com
Allow from ip-address
Allow from ip-address/netmask
Allow from @LOCAL

也可以使用 Deny 语句。例如,要授予对本地网络接口上所有主机的完全访问权限,请编辑 /etc/cups/cupsd.conf 以包含以下内容

# Restrict access to the server...
# By default only localhost connections are possible
<Location />
   Order allow,deny
   Allow from @LOCAL
</Location>

# Restrict access to the admin pages...
<Location /admin>
   Order allow,deny
   Allow from @LOCAL
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
   AuthType Basic
   Require user @SYSTEM
   Order allow,deny
   Allow from @LOCAL
</Location>

当使用 CUPS 生成的默认自签名证书时,您可能还需要禁用 HTTPS 要求

DefaultEncryption IfRequested

这应该可以避免从远程计算机使用 CUPS Web 界面时出现的错误:426 - 需要升级。

Kerberos

Kerberos 可用于验证访问远程 CUPS 服务器的用户身份。这假设您的机器有一个 keytab,并且它需要一个“HTTP”的票证。您必须使用 https://host.example.co.uk:631 而不是 https://127.0.0.1:631 - 身份验证需要加密(因此是 https),并且需要完整的主机名,以便 Kerberos/Negotiate 可以工作。此外,必须在 /etc/cups/cupsd.conf 中配置服务器以使用 NegotiateDefaultAuthType

如果您正在使用 Samba 的 winbind NSS 支持,您可以将 AD 组名称添加到 /etc/cups/cups-files.conf - 在以下示例中,sysadmin 可能是 AD 组

/etc/cups/cups-files.conf
SystemGroup sys root sysadmin

故障排除

有关常规故障排除技巧,请参阅 CUPS/Troubleshooting

无法使用 GTK 应用程序打印

如果您尝试从 GTK 应用程序打印时收到获取打印机信息失败消息,请将此行添加到您的 /etc/hosts

/etc/hosts
serverip 	some.name.tld 	ServersHostname

Windows 上的权限错误

一些用户通过使用略有不同的语法修复了 NT_STATUS_ACCESS_DENIED (Windows 客户端) 错误

smb://workgroup/username:password@hostname/printer_name

本地打印正常,但无法通过网络打印

根据打印机(特别是对于单向标签打印机),必须将一侧配置为 raw 驱动程序才能打印

其他操作系统

有关 CUPS 与其他打印系统接口的更多信息,请参阅 CUPS 手册,例如 https://127.0.0.1:631/help/network.html