CUPS 打印服务完全指南 / 第 3 章:打印机管理
第 3 章:打印机管理
本章将全面介绍 CUPS 打印机管理的方方面面,包括添加和删除打印机、配置打印选项、设置默认打印机以及掌握 lp 命令的各种用法。
3.1 打印机添加方式概览
| 方式 | 适用场景 | 难度 |
|---|---|---|
| Web 界面 | 管理员日常操作 | ⭐ 简单 |
| lpadmin 命令 | 脚本自动化 | ⭐⭐ 中等 |
| cupsctl 命令 | 快速配置 | ⭐⭐ 中等 |
| 手动编辑配置 | 高级定制 | ⭐⭐⭐ 复杂 |
| API/SDK | 程序集成 | ⭐⭐⭐ 复杂 |
3.2 使用 Web 界面管理打印机
3.2.1 添加打印机
步骤 1:登录管理界面
浏览器访问: http://localhost:631/admin
输入管理员账号密码(通常是 root 或 lpadmin 组用户)
步骤 2:选择连接方式
| 连接方式 | URI 格式 | 说明 |
|---|---|---|
| USB | usb://Make/Model?serial=xxx | 本地 USB 打印机 |
| Socket | socket://192.168.1.100:9100 | TCP/IP 直连 |
| IPP | ipp://192.168.1.100/ipp/print | IPP 协议 |
| IPPS | ipps://192.168.1.100/ipp/print | IPP over TLS |
| LPD | lpd://192.168.1.100/queue | LPD 协议 |
| HTTP | http://192.168.1.100:80/PRESENTATION/BONJOUR | HTTP 协议 |
| SMB | smb://user:password@server/printer | Samba 共享 |
步骤 3:配置基本信息
Name: 打印机名称(必填,仅限字母、数字、下划线、连字符)
Location: 位置信息(如 "3楼办公区")
Description: 描述信息(如 "HP LaserJet Pro M404 黑白激光")
Sharing: ☐ Share this printer(共享此打印机)
步骤 4:选择驱动/PPD
- 从列表选择制造商 → 型号
- 上传自定义 PPD 文件
- 选择 "Generic" 通用驱动
- 选择 "Raw"(原始队列,不处理)
3.2.2 管理已有打印机
访问: http://localhost:631/printers/打印机名称
功能:
├── Maintenance
│ ├── Pause Printer # 暂停打印机
│ ├── Reject Jobs # 拒绝新任务
│ ├── Print Test Page # 打印测试页
│ ├── Clean Print Heads # 清洁打印头
│ └── Cancel All Jobs # 取消所有任务
├── Administration
│ ├── Set As Server Default # 设为服务器默认
│ ├── Modify Printer # 修改打印机
│ └── Delete Printer # 删除打印机
└── Status
└── Printer State: idle / processing / stopped
3.3 使用 lpadmin 命令管理打印机
3.3.1 添加打印机
# 基本语法
sudo lpadmin -p 打印机名 -E -v URI -P PPD文件
# 示例 1: 添加 USB 打印机
sudo lpadmin -p HP-USB -E \
-v "usb://HP/LaserJet%20Pro%20M404?serial=ABC123" \
-P /usr/share/ppd/HP/hp-laserjet_pro_m404.ppd
# 示例 2: 添加网络打印机(Socket 协议)
sudo lpadmin -p HP-Net -E \
-v "socket://192.168.1.100:9100" \
-P /usr/share/ppd/HP/hp-laserjet_pro_m404.ppd
# 示例 3: 添加 IPP 打印机
sudo lpadmin -p HP-IPP -E \
-v "ipp://192.168.1.100/ipp/print" \
-P /usr/share/ppd/HP/hp-laserjet_pro_m404.ppd
# 示例 4: 添加 LPD 打印机
sudo lpadmin -p HP-LPD -E \
-v "lpd://192.168.1.100/queue1" \
-P /usr/share/ppd/HP/hp-laserjet_pro_m404.ppd
# 示例 5: 添加原始队列(不做任何处理)
sudo lpadmin -p RawPrinter -E \
-v "socket://192.168.1.100:9100" \
-m raw
# 示例 6: 使用 -m 指定驱动型号
sudo lpadmin -p HP-Auto -E \
-v "socket://192.168.1.100:9100" \
-m "HP LaserJet Pro M404"
# 示例 7: 使用 lpinfo 查找驱动
lpinfo -m | grep "HP LaserJet Pro M404"
# 输出: drv:///hpcups.drv/hp-laserjet_pro_m404.ppd HP LaserJet Pro M404, hpcups 3.22.10
3.3.2 lpadmin 参数详解
| 参数 | 说明 | 示例 |
|---|---|---|
-p name | 打印机名称 | -p myprinter |
-E | 启用打印机并接受任务 | -E |
-v URI | 设备 URI | -v socket://192.168.1.100 |
-P file | PPD 文件路径 | -P /path/to/file.ppd |
-m model | 驱动型号 | -m "HP LaserJet" |
-D desc | 描述信息 | -D "Office Printer" |
-L location | 位置信息 | -L "3rd Floor" |
-o option=value | 设置选项 | -o media=A4 |
-u allow:user | 允许用户 | -u allow:john |
-u deny:user | 拒绝用户 | -u deny:guest |
-d name | 设为默认打印机 | -d myprinter |
-x name | 删除打印机 | -x myprinter |
-c class | 添加到打印机组 | -c mygroup |
-i file | 使用 IPP 属性文件 | -i attrs.conf |
-r name | 从类中移除 | -r mygroup |
3.3.3 删除打印机
# 删除单个打印机
sudo lpadmin -x myprinter
# 删除所有打印机(谨慎使用)
for printer in $(lpstat -p | awk '{print $2}'); do
sudo lpadmin -x "$printer"
done
# 通过 Web 界面删除
# http://localhost:631/printers/myprinter → Administration → Delete Printer
3.3.4 修改打印机属性
# 修改描述
sudo lpadmin -p myprinter -D "New Description"
# 修改位置
sudo lpadmin -p myprinter -L "New Location"
# 修改设备 URI
sudo lpadmin -p myprinter -v "socket://192.168.1.200:9100"
# 修改 PPD 文件
sudo lpadmin -p myprinter -P /path/to/new-driver.ppd
# 添加打印机选项
sudo lpadmin -p myprinter -o media=A4 -o sides=two-sided
# 设置访问控制 - 允许特定用户
sudo lpadmin -p myprinter -u allow:john,mary,bob
# 设置访问控制 - 拒绝特定用户
sudo lpadmin -p myprinter -u deny:guest
# 允许所有用户
sudo lpadmin -p myprinter -u allow:all
3.4 打印机 URI 发现
3.4.1 使用 lpinfo 发现设备
# 列出所有可用的后端
lpinfo -v
# 输出示例:
# network socket
# network beh
# network http
# network ipp
# network lpd
# direct usb://HP/LaserJet%20Pro%20M404?serial=ABC123
# network socket://192.168.1.100:9100
# network lpd://192.168.1.101/queue
# network ipp://192.168.1.102/ipp/print
# network dnssd://HP%20LaserJet%20Pro%20M404._ipp._tcp.local./
# 只显示 USB 设备
lpinfo -v | grep usb
# 只显示网络设备
lpinfo -v | grep network
# 列出所有可用驱动
lpinfo -m | head -20
# 搜索特定驱动
lpinfo -m | grep -i "HP LaserJet"
lpinfo -m | grep -i "Canon"
lpinfo -m | grep -i "Epson"
3.4.2 自动发现网络打印机
# 使用 avahi 发现 IPP 打印机
avahi-browse -t -r _ipp._tcp
# 输出示例:
# + eth0 IPv4 HP LaserJet Pro M404 @ server1 Internet Printer local
# = eth0 IPv4 HP LaserJet Pro M404 @ server1 Internet Printer local
# hostname = [HP-LaserJet.local]
# address = [192.168.1.100]
# port = [631]
# txt = ["rp=ipp/print" "ty=HP LaserJet Pro M404"]
# 使用 ippfind 发现打印机
ippfind --txt rp
# 使用 nmap 扫描打印机
nmap -p 631 192.168.1.0/24
nmap -p 9100 192.168.1.0/24
3.4.3 常见打印机 URI 格式
# HP JetDirect / Socket
socket://192.168.1.100:9100
# IPP
ipp://192.168.1.100/ipp/print
ipp://192.168.1.100:631/ipp/print
# IPP over TLS
ipps://192.168.1.100/ipp/print
# LPD
lpd://192.168.1.100/queue_name
lpd://192.168.1.100/PASSTHRU
# HTTP
http://192.168.1.100:80/PRESENTATION/BONJOUR
# USB (自动检测)
usb://HP/LaserJet%20Pro%20M404?serial=VNB3K12345
# Samba/SMB
smb://username:password@server/printer_name
smb://WORKGROUP/server/printer_name
# DNS-SD (Bonjour)
dnssd://HP%20LaserJet%20Pro%20M404._ipp._tcp.local./
# HP 打印机特定
hp:/net/HP_LaserJet_Pro_M404?ip=192.168.1.100
# 手机/平板 AirPrint
ipp://printer.local/ipp/print
3.5 默认打印机设置
3.5.1 系统级默认打印机
# 设置系统默认打印机
sudo lpadmin -d myprinter
# 查看当前默认打印机
lpstat -d
# 输出: system default destination: myprinter
# 使用 lpoptions 设置用户级默认打印机
lpoptions -d myprinter
# 查看用户默认打印机
lpoptions -d
3.5.2 用户级默认打印机
# 设置当前用户的默认打印机(不影响其他用户)
lpoptions -d myprinter
# 用户配置文件位置
~/.cups/lpoptions
# 查看用户配置
cat ~/.cups/lpoptions
# 输出: Default myprinter media=A4 sides=two-sided
3.5.3 环境变量方式
# 使用 PRINTER 环境变量
export PRINTER=myprinter
lp document.pdf # 将打印到 myprinter
# 使用 LPDEST 环境变量(BSD 兼容)
export LPDEST=myprinter
lpr document.pdf # 将打印到 myprinter
# 在 ~/.bashrc 中设置永久默认
echo 'export PRINTER=myprinter' >> ~/.bashrc
source ~/.bashrc
3.6 打印机组(Classes)
3.6.1 创建打印机组
# 创建打印机组
sudo lpadmin -p printer1 -c mygroup
sudo lpadmin -p printer2 -c mygroup
sudo lpadmin -p printer3 -c mygroup
# 或一次性创建组并添加打印机
sudo lpadmin -c mygroup -p printer1 -p printer2 -p printer3
# 查看打印机组
lpstat -c
# 输出示例:
# class mygroup:
# printer1
# printer2
# printer3
3.6.2 管理打印机组
# 从组中移除打印机
sudo lpadmin -p printer1 -r mygroup
# 删除打印机组
sudo lpadmin -x mygroup
# 向组中添加打印机
sudo lpadmin -p printer4 -c mygroup
# 打印到打印机组(任务会分配到空闲打印机)
lp -d mygroup document.pdf
3.6.3 负载均衡打印
# 打印机组默认使用负载均衡策略
# CUPS 会将任务分配到第一个空闲的打印机
# 查看组状态
lpstat -c -v
# 打印到组
lp -d mygroup large_document.pdf
# 任务将被分配到第一个空闲的打印机
3.7 打印队列管理
3.7.1 查看打印队列
# 查看所有打印队列
lpstat -o
# 查看特定打印机的队列
lpstat -o myprinter
# 查看详细信息
lpstat -l -o myprinter
# 输出示例:
# myprinter-1 john 1024 Thu 10 May 2026 09:00:00 AM
# myprinter-2 mary 2048 Thu 10 May 2026 09:05:00 AM
# myprinter-3 bob 4096 Thu 10 May 2026 09:10:00 AM
# 查看已完成的任务
lpstat -W completed
# 查看未完成的任务
lpstat -W not-completed
3.7.2 管理打印任务
# 取消特定任务
cancel myprinter-1
# 取消所有任务
cancel -a myprinter
# 取消特定用户的任务
cancel -u john myprinter
# 移动任务到其他打印机
sudo lpmove myprinter-1 otherprinter
# 移动所有任务
sudo lpmove myprinter otherprinter
# 暂停特定任务
sudo cupsdisable myprinter-1
# 使用 lprm 删除任务(BSD 命令)
lprm myprinter-1
lprm - # 删除当前任务
lprm -P myprinter # 删除特定打印机的所有任务
3.7.3 打印机状态管理
# 暂停打印机(停止处理新任务)
sudo cupsdisable myprinter
# 恢复打印机
sudo cupsenable myprinter
# 拒绝新任务(继续处理现有任务)
sudo cupsreject myprinter
# 接受新任务
sudo cupsaccept myprinter
# 暂停打印机并拒绝任务
sudo cupsdisable myprinter
sudo cupsreject myprinter
# 查看打印机状态
lpstat -p myprinter
# 输出示例:
# printer myprinter is idle. enabled since Thu 10 May 2026 09:00:00 AM
# 查看所有打印机状态
lpstat -p
# 查看详细状态
lpstat -l -p myprinter
3.8 lp 命令高级用法
3.8.1 基本打印
# 打印单个文件
lp document.pdf
# 打印多个文件
lp file1.pdf file2.pdf file3.pdf
# 打印到指定打印机
lp -d myprinter document.pdf
# 打印多份
lp -n 5 document.pdf
# 从标准输入打印
echo "Hello" | lp
cat document.txt | lp -d myprinter
3.8.2 打印选项
# 纸张大小
lp -o media=A4 document.pdf
lp -o media=Letter document.pdf
lp -o media=A3 document.pdf
lp -o media=Legal document.pdf
# 双面打印
lp -o sides=one-sided document.pdf # 单面
lp -o sides=two-sided-long-edge document.pdf # 双面(长边翻转)
lp -o sides=two-sided-short-edge document.pdf # 双面(短边翻转)
# 页面方向
lp -o portrait document.pdf # 纵向
lp -o landscape document.pdf # 横向
# 每页多版
lp -o number-up=1 document.pdf # 每页 1 版
lp -o number-up=2 document.pdf # 每页 2 版
lp -o number-up=4 document.pdf # 每页 4 版
lp -o number-up=6 document.pdf # 每页 6 版
lp -o number-up=9 document.pdf # 每页 9 版
# 页面范围
lp -o page-ranges=1-5 document.pdf # 打印第 1-5 页
lp -o page-ranges=1,3,5 document.pdf # 打印第 1、3、5 页
lp -o page-ranges=2- document.pdf # 从第 2 页到最后
# 打印顺序
lp -o outputorder=normal document.pdf # 正序
lp -o outputorder=reverse document.pdf # 逆序
# 颜色模式
lp -o ColorModel=Gray document.pdf # 灰度
lp -o ColorModel=RGB document.pdf # 彩色
lp -o ColorModel=CMYK document.pdf # CMYK(如支持)
# 打印质量
lp -o Resolution=300dpi document.pdf
lp -o Resolution=600dpi document.pdf
lp -o Resolution=1200dpi document.pdf
# 色调/饱和度(部分打印机支持)
lp -o hue=180 document.pdf
lp -o saturation=100 document.pdf
3.8.3 作业命名和通知
# 设置作业名称
lp -t "Monthly Report" document.pdf
# 打印完成后发送邮件通知
lp -m user@example.com document.pdf
# 指定优先级(1-100,100 最高)
lp -q 50 document.pdf
lp -q 100 urgent_document.pdf
# 保持打印文件(不删除临时文件)
lp -h document.pdf
3.8.4 文件格式处理
# 强制使用原始格式(不经过过滤器)
lp -o raw document.ps
# 指定输入格式
lp -i application/pdf document.pdf
# 设置内容类型
lp -o document-format=application/pdf document.pdf
# 打印 PostScript 文件
lp -o raw document.ps
# 打印纯文本
echo "Hello World" | lp -o raw
3.9 lpstat 命令详解
3.9.1 查询打印机状态
# 查看所有打印机
lpstat -p
# 查看所有打印机和设备
lpstat -p -v
# 查看默认打印机
lpstat -d
# 查看打印机组
lpstat -c
# 查看 CUPS 服务器状态
lpstat -r
# 查看调度器状态
lpstat -s
# 查看所有状态信息
lpstat -t
# 输出示例:
# scheduler is running
# system default destination: myprinter
# device for myprinter: socket://192.168.1.100:9100
# myprinter accepting requests since Thu 10 May 2026 09:00:00 AM
# printer myprinter is idle. enabled since Thu 10 May 2026 09:00:00 AM
3.9.2 查询打印队列
# 查看所有打印队列
lpstat -o
# 查看特定打印机队列
lpstat -o myprinter
# 查看特定用户的任务
lpstat -u john
# 查看任务 ID(仅显示 ID)
lpstat -i
# 查看长格式(详细信息)
lpstat -l
# 查看未完成的任务
lpstat -W not-completed
# 查看已完成的任务
lpstat -W completed
# 查看指定时间后的任务
lpstat -W 1h # 最近 1 小时
lpstat -W 1d # 最近 1 天
3.10 lpoptions 命令详解
3.10.1 查看选项
# 查看打印机支持的所有选项
lpoptions -p myprinter -l
# 输出示例:
# PageSize/Page Size: *A4 Letter Legal A3 A5 B5
# Duplex/Double-Sided: *None DuplexNoTumble DuplexTumble
# Resolution/Output Resolution: 150x150dpi 300x300dpi *600x600dpi 1200x1200dpi
# ColorModel/Print Color Mode: *Gray RGB
# InputSlot/Paper Source: *Auto Tray1 Tray2 Manual
# MediaType/Media Type: *Plain CardStock Envelope Transparency
# OutputBin/Output Bin: *FaceUp FaceDown
# 查看当前选项设置
lpoptions -p myprinter
# 输出示例:
# copies=1 device-uri=socket://192.168.1.100:9100 ...
3.10.2 设置选项
# 设置默认纸张
lpoptions -p myprinter -o media=A4
# 设置默认双面
lpoptions -p myprinter -o sides=two-sided-long-edge
# 设置默认分辨率
lpoptions -p myprinter -o Resolution=600x600dpi
# 设置默认颜色模式
lpoptions -p myprinter -o ColorModel=Gray
# 设置默认纸盒
lpoptions -p myprinter -o InputSlot=Tray2
# 设置多选项
lpoptions -p myprinter \
-o media=A4 \
-o sides=two-sided-long-edge \
-o Resolution=600x600dpi \
-o ColorModel=Gray
# 恢复默认选项
lpoptions -p myprinter -o media=Default
lpoptions -p myprinter -o sides=Default
# 删除所有自定义选项
lpoptions -p myprinter -x
3.10.3 用户级选项
# 设置用户级选项(不影响其他用户)
lpoptions -p myprinter -o media=A4
# 查看用户选项文件
cat ~/.cups/lpoptions
# 设置系统级选项(需要 root)
sudo lpoptions -p myprinter -o media=A4
3.11 打印机配置文件
3.11.1 printers.conf 文件
# 打印机配置文件位置
cat /etc/cups/printers.conf
# 文件示例:
# <Printer myprinter>
# PrinterId 1
# UUID urn:uuid:12345678-1234-1234-1234-123456789abc
# Info HP LaserJet Pro M404
# Location 3rd Floor Office
# MakeModel HP LaserJet Pro M404
# DeviceURI socket://192.168.1.100:9100
# State Idle
# StateTime 1715308800
# ConfigTime 1715308800
# Type 8425492
# Accepting Yes
# Shared Yes
# JobSheets none none
# QuotaPeriod 0
# PageLimit 0
# KLimit 0
# OpPolicy default
# ErrorPolicy stop-printer
# </Printer>
3.11.2 手动编辑配置
# 停止 CUPS 服务
sudo systemctl stop cups
# 编辑 printers.conf
sudo vim /etc/cups/printers.conf
# 启动 CUPS 服务
sudo systemctl start cups
# 注意:通常建议使用 lpadmin 命令或 Web 界面修改配置
# 直接编辑配置文件可能导致配置冲突
3.12 业务场景实践
3.12.1 场景一:办公环境打印配置
# 需求:为办公室配置 3 台打印机
# 1. 前台黑白激光打印机(默认)
# 2. 财务彩色喷墨打印机
# 3. 行政大型复印机
# 添加前台打印机
sudo lpadmin -p Front-BW -E \
-v "socket://192.168.1.100:9100" \
-D "前台黑白激光打印机" \
-L "1楼前台" \
-P /usr/share/ppd/HP/hp-laserjet_pro_m404.ppd \
-o media=A4 \
-o sides=two-sided-long-edge \
-o ColorModel=Gray
# 添加财务打印机
sudo lpadmin -p Finance-Color -E \
-v "socket://192.168.1.101:9100" \
-D "财务彩色喷墨打印机" \
-L "2楼财务室" \
-P /usr/share/ppd/Epson/epson-inkjet.ppd
# 添加行政复印机
sudo lpadmin -p Admin-MFP -E \
-v "ipp://192.168.1.102/ipp/print" \
-D "行政大型复印机" \
-L "3楼行政部" \
-P /usr/share/ppd/Ricoh/ricoh-mp.ppd
# 设置前台打印机为默认
sudo lpadmin -d Front-BW
# 设置访问控制 - 财务打印机仅财务部可用
sudo lpadmin -p Finance-Color -u allow:finance_user1,finance_user2,finance_user3
3.12.2 场景二:开发环境 PDF 打印
# 安装 CUPS-PDF 虚拟打印机
sudo apt install -y cups-pdf
# 配置 PDF 打印机
sudo lpadmin -p PDF-Printer -E \
-v "cups-pdf:/" \
-P /usr/share/ppd/cups-pdf/CUPS-PDF.ppd \
-D "PDF 虚拟打印机" \
-o media=A4
# 设置为默认打印机
sudo lpadmin -d PDF-Printer
# 使用 PDF 打印机
lp -d PDF-Printer document.txt
# 输出文件: /var/spool/cups-pdf/$USER/
# 修改输出目录
sudo vim /etc/cups/cups-pdf.conf
# 修改 Out ${HOME}/PDF
3.12.3 场景三:打印配额管理
# 安装配额管理工具
sudo apt install -y cups-pk-helper
# 设置每用户每日打印配额
sudo lpadmin -p myprinter -o job-quota-period=86400 -o job-quota-pages=100
# 查看当前配额设置
lpoptions -p myprinter | grep quota
# 手动检查用户打印量
grep "user" /var/log/cups/page_log | wc -l
3.13 扩展阅读
| 资源 | 链接 | 说明 |
|---|---|---|
| lpadmin 手册 | man lpadmin | 完整命令参考 |
| lpstat 手册 | man lpstat | 状态查询参考 |
| lpoptions 手册 | man lpoptions | 选项管理参考 |
| CUPS 打印机管理 | https://www.cups.org/doc/admin.html | 官方管理指南 |
| OpenPrinting 数据库 | https://www.openprinting.org/printers | 打印机兼容性查询 |
3.14 本章小结
| 命令 | 功能 | 示例 |
|---|---|---|
lpadmin -p | 添加/修改打印机 | sudo lpadmin -p myprinter -E -v socket://... |
lpadmin -x | 删除打印机 | sudo lpadmin -x myprinter |
lpadmin -d | 设置默认打印机 | sudo lpadmin -d myprinter |
lpadmin -c | 添加到打印机组 | sudo lpadmin -p p1 -c group1 |
lp | 打印文件 | lp -d myprinter -n 2 file.pdf |
lpstat -p | 查看打印机状态 | lpstat -p -d |
lpstat -o | 查看打印队列 | lpstat -o myprinter |
lpoptions -l | 查看打印选项 | lpoptions -p myprinter -l |
cancel | 取消打印任务 | cancel myprinter-1 |
cupsenable | 启用打印机 | sudo cupsenable myprinter |
cupsdisable | 禁用打印机 | sudo cupsdisable myprinter |
下一章预告:我们将深入学习打印机驱动,包括 PCL、PostScript 驱动以及 IPP Everywhere 无驱动打印。
3.15 练习题
添加题:使用
lpadmin命令添加一台网络打印机,要求使用 Socket 协议、设置描述和位置。选项题:为打印机设置默认选项:A4 纸张、双面打印、灰度模式。
队列题:编写脚本监控打印队列,当队列超过 10 个任务时发送告警邮件。
配额题:配置打印机限制每个用户每天最多打印 50 页。
故障题:打印机显示 “Rejecting Jobs” 状态,如何恢复?