CUPS/打印机共享
本文包含关于从 GNU/Linux 系统共享打印机的说明。
协议 | Linux | Windows | macOS |
---|---|---|---|
发现 (DNS-SD/mDNS) | CUPS 与 Avahi | 自 Windows 10 起原生支持 | Bonjour |
Internet 打印协议 | CUPS | 控制面板 > 程序 > 启用或关闭 Windows 功能 > 打印和文档服务 > Internet 打印客户端 | 原生支持 |
SMB 共享打印机 | Samba 与 CUPS | 原生支持 | 原生支持 |
Line Printer Daemon 协议 | CUPS | 控制面板 > 程序 > 启用或关闭 Windows 功能 > 打印服务 > LPD Print Service 和 LPR Port Monitor |
原生支持 |
创建多打印机类
在 CUPS 中,类是一组打印机,对客户端来说它们就像一台打印机。当客户端选择打印到类时,CUPS 会选择组中的任何打印机来接受打印作业。当必须移除类中的一台打印机时,这可能特别有用。如果将其从类中排除,最终用户不会注意到任何变化,因为打印作业将被排队到类中的另一台打印机。创建和管理类可以通过 CUPS Web GUI 完成。
打印机共享
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 Printers 和 cupsd.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.service
和 nmb.service
。
有关更多详细信息,请参阅 Samba 的文档 Setting up Samba as a Print Server。
通过 Line Printer Daemon 协议共享
/etc/cups/cupsd.conf
中的设置执行任何访问控制。因此,在您的服务器上运行 cups-lpd 将允许您网络上的任何计算机(甚至可能是整个互联网)打印到您的服务器。远程管理
一旦服务器按照 #打印机共享 中的描述设置完成,也可以将其配置为可以远程管理。使用与 #通过 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
中配置服务器以使用 Negotiate
的 DefaultAuthType
。
如果您正在使用 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。