前言

在 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 包含两个组:

  • lpadmin
  • root

也就是说,任何属于 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 界面验证

  1. 访问 http://localhost:631/printers/
  2. 选择目标打印机
  3. 点击 Cancel Job
  4. 浏览器弹出认证框,输入用户名 p303 和对应的密码
  5. 任务成功取消 ✅

六、关键命令总结

命令 作用
lpstat -p 查看打印机状态
lpstat -o 查看打印队列
groups 查看当前用户所属组
getent group <组名> 检查组是否存在及成员
sudo usermod -aG <组名> <用户> 将用户加入指定组
sudo cancel <任务ID> 命令行取消打印任务
sudo systemctl restart cups 重启 CUPS 服务(修改配置后)

七、安全建议

  1. 最小权限原则:仅将需要管理打印机的用户加入 lpadmin 组,避免普通用户获得过高权限。
  2. 使用专用管理账户:建议创建独立的管理员账号用于打印机管理,而非使用日常办公账号。
  3. 定期审计组成员:定期检查 lpadmin 组成员列表,确保没有未经授权的用户。
  4. Web 界面安全:如果 CUPS Web 界面暴露在外网,建议配置 HTTPS 和强密码策略。

八、彩蛋:为什么 MobaXterm 重新登录后组权限生效了?

Linux 的用户组信息是在登录时loginsshd 进程从 /etc/group 读取并加载到会话中的。usermod 修改的是磁盘上的 /etc/group 文件,不会影响已经存在的会话

因此,即使命令执行成功,当前 SSH 会话中的 groups 输出仍然不会包含 lpadmin。只有重新登录创建新会话时,系统才会重新读取组信息,使新权限生效。


九、总结

CUPS 的权限体系清晰而严谨。当 Web 界面提示“已禁止”时,问题通常出在用户不属于 @SYSTEM 所定义的组。解决路径如下:

  1. 确认 SystemGroup 配置(通常在 /etc/cups/cups-files.conf
  2. 将操作用户加入对应的组(如 lpadmin
  3. 重新登录使权限生效
  4. 验证操作

本文记录的问题虽然简单,但涉及 Linux 用户组管理、CUPS 权限模型、会话机制等多个知识点,是一个典型的“小问题、深原理”的排障案例。希望对你有所帮助。


本文基于真实排障过程整理,所有命令均可复现。
作者:p303
日期:2026-06-29

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐