离上一次在 Linux 下使用打印机已经十多年了,记忆中那还是 2005 年在工商局工作的时候。在那之后,要么是不需要在 Linux 下使用打印机,要么就是办公电脑跑的不是 Linux。直到最近,公司 ERP 系统升级,需要给服务器配置打印机,才开始重新接触 Linux 下的打印机管理。
Linux 的打印系统
目前绝大多数 Linux 发行版都使用 CUPS 作为默认的打印系统,CUPS 全称为 Common Unix Printing System
,由 Michael R. Sweet 于 1997 年开始开发。如果你打开过 CUPS 的 Web 配置页面,可能会发现页面上赫然写着 Developed by Apple Inc.
,其实故事是这样的(援引维基百科):
2002 年 3 月,苹果公司在 Mac OS X v10.2 中使用了 CPUS 作为其打印系统,2007 年 2 月,苹果公司聘请了 Michael R. Sweet 并购买了 CUPS 的源代码。
配置方式
Linux 系统中可以通过三种方式来配置打印机:
- 命令行配置工具
- Web 配置页面
- 系统图形配置工具
其中 Web 和图形界面的配置相对来说较为简单,基本上对着配置界面摸索一番就能设置好打印机。而命令行对于初次在 Linux 下配置打印机的用户来说,可能需要花一点时间来熟悉和测试一些命令以及选项,所以下面会主要介绍一些命令行下常用的配置工具。
常用操作和命令
添加和删除打印机
添加和删除打印机主要使用 lpadmin
命令。
添加打印机
USB 接口打印机
假设场景如下:
- 打印机型号:HP Color LaserJet 2700
- 打印机接口:USB
- 打印机安装后命名:Printer01
首先使用 lsusb
查看打印机绑定的 USB 总线,USB 总线通常是以 Bus 00X
这样的方式命名,总线后面的 Device XXX
是该总线下的设备编号,我们只要知道打印机的型号、接口,以及对应的总线编号和设备编号就可以添加打印机了,命令如下:
1 | lpadmin -p Printer01 -E -v /dev/bus/usb/00X/XXX -m lsb/usr/HP/hp-color_laserjet_2700-ps.ppd.gz |
Windows 共享打印机
假设场景如下:
- 打印机型号:Zebra 105SL Plus
- 共享打印机 PC 的 IP 地址:192.168.2.85
- 共享打印机在 Windows 上的共享名称:Z105SLP
- 打印机安装后命名:Printer01
添加 Windows 共享打印机就没有本地 USB 打印机那么繁琐了,直接使用下面的命令:
1 | lpadmin -p Printer01 -E -v smb://192.168.2.85/Z105SLP -m drv:///sample.drv/zebra.ppd |
如果打印机的共享设置了必须输入用户名和密码才能访问,怎么办?
在 Device URI 中加上用户名和密码即可:
1 | lpadmin -p Printer01 -E -v smb://USERNAME:PASSWORD@192.168.2.85/Z105SLP -m drv:///sample.drv/zebra.ppd |
LPD 协议打印机
假设场景如下:
- 打印机型号:Zebra 105SL Plus
- 打印机 IP 地址:192.168.2.86
- 打印机安装后命名:Printer01
某些时候连接 LPD 打印机可能会需要输入完整的 Device URI,而我们在对 Zebra 的标签打印机进行测试时,只需要指定 IP 地址即可,命令如下:
1 | lpadmin -p Printer01 -E -v lpd://192.168.2.86 -m drv:///sample.drv/zebra.ppd |
删除打印机
删除打印机时就简单粗暴多了,不用管什么总线、接口、IP 地址,直接按打印机名称删除:
1 | lpadmin -x Printer01 |
命令选项解析
-p
为打印机命名
-E
启用打印机并接受打印任务
-v
指定 Device URI
-m
指定打印机对应的 PPD 文件
-x
删除打印机
关于打印机自动发现
CUPS 默认会自动发现并添加网络中其它机器上 CUPS 服务共享的打印机,当你真的需要使用他们的时候这确实很方便,但有时候根本不会用到它们,你可以使用 cupsctl
命令来控制是否自动添加网络上其它 CUPS 服务共享的打印机。
自动发现并安装网络中的打印机:
1 | cupsctl --remote-printers |
不要自动发现和安装网络中的打印机:
1 | cupsctl --no-remote-printers |
打印机状态查看
查看当前系统的默认打印机:
1 | lpstat -d |
列出当前系统中所有的打印机:
1 | lpstat -v |
查看当前系统中所有打印机的状态:
1 | lpstat -p |
查看打印机 Printer01
的状态:
1 | lpstat -p Printer01 |
打印机状态管理
启用打印机和接受打印任务
如果你在添加打印机时忘了加上 -E
选项,则打印机被添加之后默认是处于禁用且拒绝打印任务的状态,这个时候你可以使用下面的命令来启用打印机:
1 | cupsenable Printer01 |
然后让其接受打印任务:
1 | cupsaccept Printer01 |
在某些时候,打印任务进行到一半时打印机被拔掉或重启了,系统可能会显示该打印机为 Paused
状态,此时使用上面的 cupsenable Printer01
可以重新启用打印机并继续执行之前中断的打印队列。
禁用打印机和拒绝接受打印任务
禁用打印机:
1 | cupsdisable Printer01 |
拒绝接受打印任务:
1 | cupsreject Printer01 |
打印机参数设置
查看打印机 Printer01
的当前参数设置:
1 | lpoptions -p Printer01 |
将 Printer01
设置为默认打印机:
1 | lpoptions -d Printer01 |
设置打印机 Printer01
使用 A4
纸张进行打印:
1 | lpoptions -p Printer01 -o PageSize=A4 |
设置打印机 Printer01
使用 600 DPI
的分辨率进行打印:
1 | lpoptions -p Printer01 -o Resolution=600dpi |
打印机权限管理
允许所有用户使用 Printer01
打印(打印机添加后默认即是所有用户可使用):
1 | lpadmin -p Printer01 -u allow:all |
仅允许用户 rainy
和 wykris
使用 Printer01
打印:
1 | lpadmin -p Printer01 -u allow:rainy,wykris |
仅允许用户 rainy
和 wykris
以及 erp
组的成员使用 Printer01
打印:
1 | lpadmin -p Printer01 -u allow:rainy,wykris,@erp |
除 rainy
和 wykris
以外的所有用户都可以使用 Printer01
打印:
1 | lpadmin -p Printer01 -u deny:rainy,wykris |
打印文件
CUPS 提供了两个可以用来打印的命令行工具,分别是 lp
和 lpr
。
使用 lp
打印
调用默认打印机打印 test.txt
:
1 | lp test.txt |
调用打印机 Printer01
打印 test.txt
:
1 | lp -d Printer01 test.txt |
调用默认打印机将 test.txt
打印 3
份:
1 | lp -n 3 test.txt |
调用默认打印机打印 test1.txt
和 test2.txt
:
1 | lp test1.txt test2.txt |
使用 lpr
打印
调用默认打印机打印 test.txt
:
1 | lpr test.txt |
调用打印机 Printer01
打印 test.txt
:
1 | lpr -P Printer01 test.txt |
调用默认打印机将 test.txt
打印 3
份:
1 | lpr -#3 test.txt |
调用默认打印机打印 test1.txt
和 test2.txt
:
1 | lpr test1.txt test2.txt |
lp
默认会回显打印任务所使用的打印机以及打印任务的编号,而 lpr
是静默执行,如果希望 lp
提交打印任务时也静默执行,可以加上 -s
选项。
管理打印任务
查看任务
查看默认打印机的任务:
1 | lpq |
查看所有打印机的任务:
1 | lpq -a |
查看打印机 Printer01
的任务:
1 | lpq -P Printer01 |
删除任务
删除编号为 269
的任务(任务编号可使用 lpq
命令查看):
1 | lprm 269 |
删除默认打印机的第一个任务:
1 | lprm |
删除打印机 Printer01
的第一个任务:
1 | lprm -P Printer01 |
删除默认打印机的所有任务:
1 | lprm - |
删除打印机 Printer01
的所有任务:
1 | lprm -P Printer01 - |
转移任务
将编号 269
的任务移至打印机 Printer01
:
1 | lpmove 269 Printer01 |
将打印机 Printer01
的所有任务移至打印机 Printer02
:
1 | lpmove Printer01 Printer02 |
上面介绍了一些 Linux 打印机管理和配置工具的常用选项,如果想要深入了解更详细的内容,可以查阅相关命令的手册和源代码。