资讯动态

Ubuntu打印机共享:CUPS+IPP配置指南,Windows稳定连接不报错

发布时间:2026/9/18 6:28:33 来源:尧图企业网站定制
折腾打印机共享这件事Ubuntu加Windows的组合是我见过最容易让新手当场崩溃的场景之一。明明打印机本地打得挺好Windows那边死活找不到或者好不容易连上了打两张就报错。这类问题我在公司、在家里都踩过不少次后来把整套逻辑理顺之后发现其实核心就一句话别让Windows去猜网络里有谁直接把打印机地址告诉它。这篇文章就围绕这个核心思路展开把Ubuntu系统如何配置共享打印机、Windows如何稳定连接讲透。适合三类人看家里有台Ubuntu老机器想当打印服务器的公司里有Linux服务器需要挂共享打印机的以及刚在虚拟机里装完Ubuntu、想用宿主机直接打印的。不管你是命令行新手还是老手跟着走一遍基本都能通。1. 共享方案选型CUPS与IPP为什么是正路1.1 先搞懂打印机共享到底在共享什么打印机跟普通文件不一样它不是把“文件”传过去而是把排版好的数据流交给打印服务处理。在Ubuntu上这个打印服务通常就是CUPSCommon UNIX Printing System。CUPS是Linux世界的事实标准几乎所有发行版默认都在用它的核心作用是把乱七八糟的打印机协议USB、网络、并口统一成一套管理接口。Windows要连Ubuntu上的共享打印机本质上是Windows的打印服务跟Linux的CUPS服务之间能说上话。沟通协议主要有两条路一条是走SMB/CIFS也就是常说的Samba协议跟文件共享走同一套东西另一条是走IPPInternet Printing Protocol互联网打印协议。两条路都能走通但体验差别很大。我早期配共享打印机第一反应就是在Ubuntu上装Samba把打印机当成共享资源暴露出去。这套方案不是不行但有个问题Samba要处理账号权限、要把SMB协议版本对齐、还要面对Windows各种安全更新策略任何一个环节出问题都是黑乎乎的报错。相比之下CUPS原生支持的IPP协议要干净得多——Windows从Win7开始就内置了IPP客户端不需要额外装驱动框架直接在地址栏输入打印机URL就能连。1.2 三种共享方式对比与选型建议方案协议配置复杂度对Windows友好度适用场景CUPS IPPIPP/IPPS低高最推荐纯Linux环境首选Samba共享SMB/CIFS高中需要跟文件共享统一管理时USB直连 本机共享无无需配置低打印机本来就在Windows本机不涉及Linux如果你是在Ubuntu主机上插着USB打印机想让Windows局域网访问我强烈建议直接走CUPS的IPP。如果打印机本身带网口那更简单Windows可以直接连打印机自带的IP根本不用经过Ubuntu中转——这种情况其实不需要看这篇文章。我这里主要针对的是“打印机USB接在Ubuntu机器上Windows通过网络去打印”这种典型拓扑。还有一个容易忽略的点CUPS不仅支持IPP还支持把打印队列通过Samba再暴露出去。也就是说你可以同时开启两种方式Windows那边想用哪种连都行。但我自己的实践结论是能用IPP就优先IPPSMB作为备用这能避开大量后续麻烦。2. Ubuntu端配置装上CUPS并打开共享2.1 安装CUPS并先确认打印机本身能打大多数Ubuntu装完之后CUPS已经在跑了没有的话先装sudo apt update sudo apt install cups -y装完先别急着开共享第一件事是确认Ubuntu自己能不能正常用这台打印机。直接在“设置 → 打印机”里添加或者用命令行看CUPS认没认到设备lpstat -p -dlpstat -p会列出所有打印机队列-d显示默认打印机。如果这里什么都看不到说明打印机压根没被系统识别。USB打印机可以再确认一下内核有没有看到设备lsusb这一步很关键我自己就遇到过打印机USB线接触不良导致时好时坏的情况lsusb能直接看到设备是否在总线上。如果打印机本身带网口确保Ubuntu和它在同一网段并且能ping通再继续。2.2 开放CUPS远程管理与共享开关CUPS默认只监听本机回环地址127.0.0.1也就是说你在浏览器里打开它的管理页面只有Ubuntu本机能访问局域网其他机器根本进不来。要让它服务整个局域网需要修改监听的网络地址。最简单的方式是用cupsctl命令直接改不需要手搓配置文件sudo cupsctl --remote-admin --remote-any--remote-admin允许远程Web管理方便你从Windows浏览器直接访问CUPS管理界面。--remote-any让CUPS监听所有网络接口而不是只监听localhost。这两条命令执行完CUPS会重写/etc/cups/cupsd.conf。如果你更习惯手动改文件也可以编辑这个配置文件找到Listen指令把它改成Listen 0.0.0.0:631并在Location /里放开Allow all或指定网段。我不太建议第一次配置就手动改文件因为CUPS的配置文件语法有版本差异一个Allow写错位置就可能整个服务起不来用cupsctl安全得多。改完之后还需要在Web界面里把共享开关打开。浏览器访问http://Ubuntu的IP:631在“Administration”选项卡里勾选“Share printers connected to this system”这里会让你输管理员账号输入Ubuntu系统账密即可。这个开关对应的是CUPS配置里的Browsing和Shared参数不开的话后面Windows怎么折腾都找不到打印机。2.3 开放防火墙端口并验证服务状态Ubuntu默认有没有开防火墙取决于你装的是桌面版还是服务器版以及安装时有没有启用了UFW。保险起见把631端口放出来sudo ufw allow 631/tcp如果打印机是通过Samba方式暴露的顺便也要把SMB端口放开sudo ufw allow samba sudo ufw allow 445/tcp然后确认CUPS服务在跑systemctl status cups看到active (running)就说明服务正常。再看一下Ubuntu当前的IP地址后面要用ip addr show取inet那一行形如192.168.1.100的就是。从Windows机器上先telnet 192.168.1.100 631试一下端口通不通telnet没装的话也可以用nc -zv 192.168.1.100 631。这一步能排除一大半网络问题。3. Windows端连接三种方式一条条说清楚3.1 图形界面按名称手动添加网络打印机这是最推荐普通用户使用的方式核心就一句话不要依赖Windows自动搜索直接把打印机URL填进去。打开Windows的“设置 → 蓝牙和其他设备 → 打印机和扫描仪”点“添加设备”。Windows会转圈扫描大概率找不到因为Windows默认的网络发现不一定能识别CUPS广播的打印机。扫描结束后会显示“我需要的打印机不在列表中”点进去选择“按名称或TCP/IP地址添加打印机”地址填http://192.168.1.100:631/printers/队列名这里的队列名就是你在CUPS里给打印机起的名字可以用lpstat -p查。比如队列名是Canon_MF4450URL就是http://192.168.1.100:631/printers/Canon_MF4450输入后会提示需要安装驱动。Windows自带的驱动库里如果没有对应型号不要慌选一个兼容驱动顶上比如“Generic PostScript Printer”或者厂商同系列其他型号的驱动很多时候能直接打。如果必须要原厂驱动去打印机官网下载装好再重复上述添加步骤。还有一个小技巧如果打印机型号太冷门Windows驱动库和官网都找不到可以试试改用IPP而不是HTTP前缀ipp://192.168.1.100:631/printers/队列名Windows在部分版本下对ipp://协议的支持比http://更顺滑我见过不少http://连不上但换ipp://秒连的案例。这个没有绝对规律排错时可以排列组合试。3.2 命令行方式给运维和批量部署用如果你需要给公司几十台Windows统一添加共享打印机右键一台台点设置能点到怀疑人生。这时候用命令行最高效。用rundll32来调打印配置界面rundll32 printui.dll,PrintUIEntry /in /n http://192.168.1.100:631/printers/Canon_MF4450/in表示安装打印机/n后面跟的是打印机路径。这个命令的本质跟图形界面手动输入URL一模一样好处是能写进批处理脚本里批量执行。如果你想在用户不知情的情况下静默添加可以加/q参数rundll32 printui.dll,PrintUIEntry /in /q /n http://192.168.1.100:631/printers/Canon_MF4450如果是通过Samba共享方式连接命令里的路径要换成UNC格式rundll32 printui.dll,PrintUIEntry /in /n \\192.168.1.100\Canon_MF4450这里有一个重要区别走IPP时Windows本机并不需要额外开什么服务走SMB时Windows的PrintSpooler和Workstation服务都必须在运行状态否则会报各种莫名其妙的错误。3.3 Windows驱动识别与处理思路驱动这块是共享打印机最容易翻车的地方。CUPS这边的驱动只影响Ubuntu本机输出Windows那边用的驱动其实是Windows自己的驱动两边互不相干。你在Ubuntu装了厂商驱动不代表Windows连过来就能用这是很多新手理解的误区。Windows连IPP打印机时理论上支持“无驱动打印”driverless printing也就是打印机通过IPP协议把自己的能力告诉WindowsWindows用系统内置的类驱动直接输出。但现实中这个流程经常卡在半路尤其是老打印机。我的经验是优先装厂商Windows驱动装完再添加网络端口没有新版驱动就用系统兼容驱动能打但可能缺失双面打印等高级功能如果连兼容驱动都连不上去查CUPS的日志看是数据传过去了没还是数据传过去之后格式不对。查看CUPS日志的办法tail -f /var/log/cups/error_log日志会显示谁在什么时间发起了打印请求、状态是成功还是失败。这个日志是排查所有打印问题的总钥匙。4. 常见错误代码与故障排查实录4.1 网络层先行ping、端口、日志三板斧不管报什么错我建议先按下面顺序排查不要在错误代码里死磕ping Ubuntu的IP确认两台机器在同一个网段能互通telnet Ubuntu的631端口确认CUPS真的在监听并且防火墙没挡住看CUPS的error_log和access_log确认请求有没有到达Linux这边。很多情况下Windows报错Linux这边日志里根本没动静说明问题出在网络层或Windows本机跟CUPS无关。如果日志里有请求记录但返回了错误状态那才需要往CUPS配置和驱动方向查。另外提醒一句如果Ubuntu装在一台虚拟机里比如VMware或VirtualBox要确认网络模式是“桥接”还是一般的“网络地址转换”。网络地址转换模式下虚拟机有独立IP但外部设备不一定能主动访问它打印请求会有去无回。共享打印机这种场景建议直接用桥接网络让Ubuntu虚拟机跟Windows宿主机在同一个网段里面互访。4.2 高频错误代码速查表Windows连网络打印机报的错很多是历史遗留问题网上到处有人在问我整理了几个出现频率极高的错误代码和对应解法都是自己实际处理过的场景。错误代码常见触发原因处理办法0x00000709本机已有同名打印机队列或打印机驱动版本异常删除本机原有打印机及驱动清理HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers中同名残留重启Spooler服务0x00000006网络路径访问被拒多为SMB认证或权限问题改用IPP方式连接检查Windows凭据管理器确认Linux侧Samba账号密码正确0x000011bWin10/11安全更新后与旧版共享打印驱动不兼容的经典故障安装打印机最新Windows驱动或用管理员权限在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print下新建RpcAuthnLevelPrivacyEnabled为0或改用IPP协议完全绕开SMB0x00000012打印假脱机文件无法被正确读取文件损坏或权限异常重启Print Spooler服务清空C:\Windows\System32\spool\PRINTERS目录重装驱动0x00000040IPP连接时协议参数不匹配尝试把http://换成ipp://或反过来确认URL拼接正确0x00000002无法连接到打印机主机确认Ubuntu端CUPS服务在运行端口可访问URL的IP和队列名没写错特别说一下0x00000709这是所有错误里最容易误导人的一个。很多人以为网络有问题其实问题往往出在本地打印机缓存里已经有一个同名的打印机队列系统觉得“你已经装过了”于是拒绝再次安装。解决办法是先把旧的打印机设备删掉再打开服务管理器WinR输入services.msc找到“Print Spooler”重启一下必要时清空上面表格里说的spool目录。这个操作能解决一半以上“操作无法完成”类的报错。4.3 Win10/Win11系统更新与Print Spooler相关的坑Windows在2021年后为了修复Print Spooler相关的安全漏洞做了不少策略收紧之后共享打印机问题集中爆发。你会发现很多打印机共享教程的时间一久就不灵了大概率就是Windows策略变了。首先是PrintNightmare漏洞修复后Windows默认限制了非管理员用户安装打印机和向共享打印机发送打印请求的能力。如果你的Windows账号是普通用户添加打印机时可能会被直接拒绝或者提示需要管理员权限。解决方案是给当前账号临时管理员权限再操作或者让管理员帮你装好打印机普通用户直接使用。其次是Print Spooler服务默认启动类型问题。Windows为了减小攻击面在某些版本上会把Print Spooler设为手动启动如果系统重启过打印服务可能根本没有跑起来。打开服务管理器找到Print Spooler如果状态是停止的把它启动起来并建议把启动类型改为“自动”这样以后不会因为服务没启动而误以为打印机坏了。最后是RpcAuthnLevelPrivacyEnabled注册表项。这个键是在系统更新后出现的默认情况下系统会强制要求RPC层的身份认证级别老驱动不兼容就容易报0x000011b。互联网上流传的“nt6打印机共享修复工具”这类一键修复工具本质就是替你把相关注册表值改了。如果你不想用不明来路的工具可以自己手动改。打开注册表编辑器定位到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print在右侧新建一个名叫RpcAuthnLevelPrivacyEnabled的DWORD32位值数值数据填0重启系统生效。这个操作的本质是把RPC认证要求降级允许老驱动以旧方式通信。但我必须提醒一句这是典型的安全与便利的权衡改完之后打印问题能解决但打印服务对未经认证连接的防护也会相应降低。如果是自己家或内部可控网络问题不大如果打印机暴露在不可信网络里建议优先通过升级驱动、改用IPP的方式解决而不是直接改这个键。4.4 SMB安全策略导致的经典0x000011b处理0x000011b这个错误码在热词里出现频率极高值得单独拿出来说。它最典型的发生场景是Windows系统更新之后原本能连的共享打印机突然全部不能打了报“操作无法完成错误0x000011b”。这个问题的根子在Windows的SMB协议和打印机驱动安全策略上。老的打印机驱动通过SMB共享打印时走的是一种不太安全的RPC绑定方式系统为了堵住漏洞把这条路给禁了。所以你会发现不仅是连Ubuntu的共享打印机报错连Windows互相之间的打印机共享也会报同样的错。处理方式一共三条路按优先顺序排换IPP方式连接。这是最干净的方案直接从SMB的处理链路换成HTTP/IPP链路完全不涉及打印机RPC绑定不存在0x000011b的触发条件安装打印机厂商发布的最新Windows驱动。很多大厂针对这个更新出了修复版的驱动换上新驱动能兼容新的安全策略手动改注册表。也就是上一节说的RpcAuthnLevelPrivacyEnabled设为0或者用修复工具一键处理。我个人建议能走IPP的绝不碰注册表。IPP方案不但能规避这个错误整条链路反而更稳定这就是我在这篇文章开头说“别让Windows去猜网络里有谁”的真正原因。5. 进阶玩法与稳定运行经验5.1 建立打印账户与权限控制如果是多人共用一台打印服务器直接让所有人用同一个系统账号连会带来两个问题一是CUPS的Web界面暴露在网络上任何人能访问可能修改配置二是Windows连接打印时如果触发了认证用户名密码在局域网里裸奔传安全性堪忧。我的建议是如果打印机纯粹用于共享打印不给用户开放CUPS的Web管理权限。CUPS的管理页面在http://IP:631默认情况下局域网内都能打开最好把它限制住。手动编辑/etc/cups/cupsd.conf把Location /admin的Allow段改成只允许你的管理IPLocation /admin Order allow,deny Allow 127.0.0.1 Allow 192.168.1.0/24 /Location不让配置修改面暴露在外能省掉不少潜在麻烦。如果用的是一台公共机器还想限制“谁可以打印”可以给CUPS设置认证在添加打印机时勾选“需要认证”并且给有打印需求的用户创建独立的Linux账号。这样每个用户的打印任务都能在CUPS日志里追到人出了问题能快速定位是谁在刷任务。5.2 多台Windows设备批量添加的脚本思路公司环境里几十台电脑一台台添加打印机最省力的方式是把添加和配置写成批处理脚本配合组策略或登录脚本下发。一个最简单的批量添加脚本如下echo off set PRINTER_URLhttp://192.168.1.100:631/printers/Canon_MF4450 set PRINTER_NAMEShared_MF4450 rundll32 printui.dll,PrintUIEntry /in /q /n %PRINTER_URL% printui.dll,PrintUIEntry /y /q /n %PRINTER_NAME%第一行是添加第二行是设为默认打印机。需要留意的是脚本必须以管理员身份运行而且Windows的SmartScreen可能会拦截rundll32调用打印机安装需要在部署前在测试机上验证一遍。如果你们用的是AD域环境还可以通过组策略的“用户配置 → 首选项 → 控制面板设置 → 打印机”来集中下发映射网络打印机。这种方式下用户在登录域账号时能自动添加打印机体验比批处理更好。走组策略时打印机路径同样可以直接填IPP的URL也可以填\\服务器\共享名形式的SMB路径看你们网络环境更偏向哪种协议。5.3 打印机掉线后自动恢复的技巧USB打印机接在Ubuntu上打印机断电重启或者USB线被碰一下CUPS的打印队列经常会进入暂停或者挂起状态后面的任务全部堵死。这类问题很得罪人因为别人不知道Linux服务器出了状况只知道打印不出来。快速处理手段是重启CUPS或者手动恢复打印机队列sudo cupsenable 队列名 sudo systemctl restart cups长期角度来看可以用一个简单的脚本监控队列状态。在crontab里加一条*/5 * * * * /usr/bin/lpstat -p 队列名 | grep -q enabled || sudo /usr/sbin/cupsenable 队列名这个脚本每五分钟检查一次队列是否处于可用状态如果被暂停了就自动恢复。注意cupsenable需要管理员权限crontab里如果用的是普通用户要配置好sudo免密规则或者直接把脚本丢到root的crontab里。再有就是如果是通过网络连接的打印机打印机本身有网口建议在CUPS里把打印队列类型设置成“网络打印机的Socket/JetDirect”并且给打印机设置一个保留的静态IP。这样打印机断电恢复后IP地址不会漂移CUPS队列状态也不大容易进入异常。最后说点自己的体会整套方案跑通之后最值得总结的心得是打印共享出问题不要急着在网上搜错误码先想清楚数据链路在哪一段断了。Windows报错不一定就是Linux的锅Ubuntu的CUPS日志会告诉你请求有没有到达同理CUPS日志显示任务已发送成功而Windows还报错那多半是驱动或者Windows服务的问题。有了日志这把尺子再复杂的问题也能拆成一段一段去排查。我自己现在的做法是Ubuntu上只用CUPS开启IPP和IPPS加密版IPP不再额外为打印机单独配SambaWindows机器统一用”按名称添加打印机“的方式连接驱动装的是打印机官网的最新版。这套组合不敢说100%没故障但比早期用Samba共享省心得多出了故障也多半在几分钟内能定位。你如果正卡在某个错误上把Linux日志和Windows报错码都拉出来对着一比八成能找到方向。希望这篇实操记录能让你少踩几个我当年踩过的坑。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价