如何在 Linux 中轻松共享 CUPS 打印机?

如何在 Linux 中轻松共享 CUPS 打印机?

我在两台计算机上运行 Arch Linux。我一直在尝试共享连接到服务器的USB打印机,以便客户端计算机可以打印到它。

按照我在这里找到的说明进行操作https://www.cups.org/doc/sharing.html,我在服务器上运行以下命令来共享我的打印机:

cupsctl --share-printers
lpadmin -p printer -o printer-is-shared=true

这使得可以通过 CUPS Web 界面“列出可用打印机”查看客户端计算机上的打印机。但是,当我添加打印机、选择 PPD 并尝试打印测试页时,出现错误

"Unable to locate printer "server_name.local"."

根据这个帖子其中提到了 mDNS,我想这可能是因为我禁用了systemd-resolved哪个打破 NSCD并给我带来其他问题。但是,当我在客户端和服务器上启动它时,我仍然遇到相同的错误。

当我编辑/etc/cups/printers.conf更改打印机的“DeviceURI”时

dnssd://name%20of%20local%20printer._ipp._tcp.local/cups?uuid=f7c17874-8003-30ee-40b0-7f21f5f107c3

lpd://server_name/name_of_printer_queue

并尝试打印测试页,我看到连接已建立,但最终收到错误“打印机正在使用中。”。

我尝试通过“添加打印机 > LPD/LPR 主机或打印机”创建新打印机,并尝试了“示例”下 URI 后面的各种设备 URI,例如:

ipp://server_name:631/ipp/name_of_printer_queue

这导致了诸如“打印机配置不正确或打印机不再存在”之类的错误。或“过滤失败”。

我认为这项技术在过去的某个时候曾发挥过作用。如何在 Linux 中可靠地打印到另一台 CUPS 服务器?

答案1

经过我刚才描述的尝试后,我注意到 URL 的最底部https://www.cups.org/doc/sharing.html说:

配置客户端计算机的最繁琐的方法是使用 lpadmin(8) 命令手动配置每个远程队列:lpadmin -p printer -E -v ipp://server/printers/printer -m everywhere

我尝试运行此命令来修改我之前通过“查找新打印机”按钮创建的打印机。这一点也不乏味,我可以在打印机上打印测试页,并且立即打印出来。

答案2

问题是为什么 CUPS 无法解析 .local 名称,但可以用它找到打印机。

CUPS 在 avahi/snmp 的帮助下找到本地网络打印机。它仅提供打印机的 URL。

但 CUPS 永远不会解析主机名本身。我猜它内部使用 glibc (?) 打开到主机的套接字。

然后它将 URL 发送到您的 DNS。但 DNS 不知道“.local”。他无法或未配置为知道该特殊的“.local”域。因此,在您的情况下,DNS 无法解析,返回错误并中断它。

借助 gnu 名称服务开关 (nss),您可以提供诸如 nss-mdns(对于每个“.local”)或 libnss-winbind(对于仅具有“主机名”的扩展)之类的扩展。

在我安装了 nss-mdns 包 + 交换机条目后,我的 cups 和解析 .local 名称问题就消失了。

相关内容