Linux CUPS 打印机管理权限排障实录:从“已禁止”到“操作成功”
前言
在 Linux 环境中管理打印机,CUPS(Common UNIX Printing System)是最常用的解决方案。它提供了 Web 管理界面,方便用户远程查看打印机状态、管理打印任务。然而,不少管理员在使用 Web 界面取消打印任务时,会遇到一个令人困惑的错误:
任务操作失败: 已禁止


本文记录了我在 Ubuntu 24.04.3 LTS 环境中解决这一问题的完整过程,从现象复现、原理分析到最终解决,希望能为遇到类似问题的同行提供参考。
一、问题现象
1.1 环境信息
| 项目 | 信息 |
|---|---|
| 操作系统 | Ubuntu 24.04.3 LTS (GNU/Linux 6.8.0-90-generic) |
| 打印服务 | CUPS |
| 客户端 | MobaXterm v24.2 (SSH) |
| 问题打印机 | HP-LaserJet-1320 |
1.2 问题描述
管理员通过 CUPS Web 界面(http://localhost:631/printers/)查看打印机状态时,发现一台打印机存在卡住的打印任务。点击 Cancel Job 按钮取消任务时,页面返回错误提示:
任务 Error
任务操作失败: 已禁止
与此同时,通过命令行检查打印机状态,发现打印机已经恢复正常:
p303@printer303:~$ lpstat -p
printer HP-LaserJet-1320 now printing HP-LaserJet-1320-2159. enabled since Mon Jun 29 03:17:27 2026
这表明打印服务本身没有问题,问题出在 Web 界面的操作权限上。
二、原理分析:CUPS 的权限模型
在动手解决之前,有必要理解 CUPS 的权限体系。CUPS 的权限控制分为两个层次:
2.1 访问控制层(Access Control)
由 <Location> 和 Order allow,deny / Order deny,allow 指令控制。
Order deny,allow 的含义是:先处理拒绝规则,再处理允许规则,即“白名单”逻辑。反之,Order allow,deny 是“黑名单”逻辑。
查看配置文件:
p303@printer303:~$ sudo cat /etc/cups/cupsd.conf
<Location />
Order allow,deny
Allow all
</Location>
<Location /admin>
Order allow,deny
Allow all
</Location>
由于配置了 Allow all,所有 IP 地址均能访问,因此问题不在此层。
2.2 授权层(Authorization)
由 <Limit> 块中的 Require user 指令控制。以取消任务(Cancel-Job)为例:
<Limit Cancel-Job>
Require user @OWNER @SYSTEM
Order deny,allow
</Limit>
其中:
@OWNER:任务的提交者(即打印任务的创建者)@SYSTEM:系统管理组,其具体成员由/etc/cups/cups-files.conf中的SystemGroup定义
因此,只有任务所有者或系统管理组成员才有权取消任务。
2.3 关键配置:SystemGroup
查看 SystemGroup 的定义:
p303@printer303:~$ grep "^SystemGroup" /etc/cups/cups-files.conf
SystemGroup lpadmin root
这表明 @SYSTEM 包含两个组:
lpadminroot
也就是说,任何属于 lpadmin 组或 root 组的用户,都拥有系统管理权限,包括取消任意打印任务。
三、问题定位
3.1 检查当前用户组
p303@printer303:~$ groups
p303 adm cdrom sudo dip plugdev lxd
输出中没有 lpadmin,也没有 root。因此,用户 p303 不属于 @SYSTEM。
3.2 检查 lpadmin 组是否存在
p303@printer303:~$ getent group lpadmin
lpadmin:x:108:
组存在,但成员列表为空(冒号后面没有用户名)。这意味着:
lpadmin组已经存在p303不在该组中- 因此
p303不满足Require user @SYSTEM的条件
3.3 结论
Web 界面操作时,当前登录用户
p303不属于lpadmin组,不满足 CUPS 的Cancel-Job授权条件,因此返回“已禁止”错误。
四、解决方案
4.1 核心命令:将用户加入管理组
sudo usermod -aG lpadmin p303
命令解析:
usermod:修改用户账户信息-aG:-a(append)表示追加,-G(groups)指定附加组列表lpadmin:目标组名p303:用户名
⚠️ 重要:-a 参数必须与 -G 一起使用,否则会覆盖用户原有的所有附属组,导致用户失去 sudo 等权限。
4.2 验证添加结果
p303@printer303:~$ getent group lpadmin
lpadmin:x:108:p303
确认 p303 已出现在 lpadmin 组的成员列表中。
4.3 使组权限生效
组权限不会在当前会话中自动生效,必须重新登录:
exit
然后重新建立 SSH 连接,登录后再次验证:
p303@printer303:~$ groups
p303 adm cdrom sudo dip plugdev lxd lpadmin
输出中已包含 lpadmin,权限生效。
五、最终验证
5.1 命令行验证(可选)
使用 curl 模拟 Web 认证请求,验证取消任务的权限:
curl -u p303:密码 -X POST "http://localhost:631/jobs/2159" -d "OP=cancel"
返回正常页面即表示权限配置成功。
5.2 Web 界面验证
- 访问
http://localhost:631/printers/ - 选择目标打印机
- 点击 Cancel Job
- 浏览器弹出认证框,输入用户名
p303和对应的密码 - 任务成功取消 ✅
六、关键命令总结
| 命令 | 作用 |
|---|---|
lpstat -p |
查看打印机状态 |
lpstat -o |
查看打印队列 |
groups |
查看当前用户所属组 |
getent group <组名> |
检查组是否存在及成员 |
sudo usermod -aG <组名> <用户> |
将用户加入指定组 |
sudo cancel <任务ID> |
命令行取消打印任务 |
sudo systemctl restart cups |
重启 CUPS 服务(修改配置后) |
七、安全建议
- 最小权限原则:仅将需要管理打印机的用户加入
lpadmin组,避免普通用户获得过高权限。 - 使用专用管理账户:建议创建独立的管理员账号用于打印机管理,而非使用日常办公账号。
- 定期审计组成员:定期检查
lpadmin组成员列表,确保没有未经授权的用户。 - Web 界面安全:如果 CUPS Web 界面暴露在外网,建议配置 HTTPS 和强密码策略。
八、彩蛋:为什么 MobaXterm 重新登录后组权限生效了?
Linux 的用户组信息是在登录时由 login 或 sshd 进程从 /etc/group 读取并加载到会话中的。usermod 修改的是磁盘上的 /etc/group 文件,不会影响已经存在的会话。
因此,即使命令执行成功,当前 SSH 会话中的 groups 输出仍然不会包含 lpadmin。只有重新登录创建新会话时,系统才会重新读取组信息,使新权限生效。
九、总结
CUPS 的权限体系清晰而严谨。当 Web 界面提示“已禁止”时,问题通常出在用户不属于 @SYSTEM 所定义的组。解决路径如下:
- 确认
SystemGroup配置(通常在/etc/cups/cups-files.conf) - 将操作用户加入对应的组(如
lpadmin) - 重新登录使权限生效
- 验证操作
本文记录的问题虽然简单,但涉及 Linux 用户组管理、CUPS 权限模型、会话机制等多个知识点,是一个典型的“小问题、深原理”的排障案例。希望对你有所帮助。
本文基于真实排障过程整理,所有命令均可复现。
作者:p303
日期:2026-06-29
更多推荐


所有评论(0)