linux - CUPS绕过接口(interface)

标签 linux printing cups

我有一台服务器,上面有几台串行打印机设置为杯子中的原始队列。在其中的每一个上,我都安装了接口(interface)脚本来执行一些简单的输出操作,并使用在服务器上运行的应用程序处理 IPC,并且喜欢直接连接到打印机并写入它们,这与 cups 认为的不一致他完全控制打印机设备。那里的一切似乎都在工作。

在服务器上输入另一个应用程序,虽然它确实通过了 cups(在通过其自己的打印后台处理程序进行假脱机处理之后),但似乎正在将特定于打印机的转义码注入(inject)到它打印出的文件中。换句话说,此应用程序生成的打印件不仅仅是纯文本字符流,还包含打印机要解释的二进制控制代码。

我遇到的问题是,当 cups 从第二个应用程序接收此类文件时,它似乎绕过了我的界面。我通过设置两个几乎相同的打印文件对此进行了测试。第一个包含纯文本“Hello, world!”后跟一个换行符;第二个包含其中一台打印机的一些转义码,然后是“Hello,world!”和换行符。然后我在我的打印机界面上添加了一行“sleep 5”,这样打印时就会有明显的延迟。

当我使用 lp 打印第一个文件时,有五秒钟没有任何反应,之后打印机启动并写出“Hello, world!”然而,当我使用完全相同的 lp 命令打印第二个文件时,它立即打印出“Hello, world!”没有 sleep 。我还注意到我可以在 lp 中使用“-o raw”选项来强制对第一个文件执行相同的操作(立即将其打印出来,无需五秒钟延迟)。

我的猜测是 cups 正在查看正在打印的实际数据并尝试确定其类型,当它在数据中看到打印机转义码时,它决定这是“原始”打印并绕过接口(interface)。这不是我预期的行为,因为我首先将打印机设置为“原始”队列,并假设这意味着杯子只会传递通过接口(interface)发送给它的任何东西;尽管如此,这就是我所看到的行为。

我的问题是:有没有办法向 cups 发送一个选项(-o raw 除外,它似乎也绕过了接口(interface))告诉他不要检测类型接收到的打印数据并继续将其发送到接口(interface)脚本?或者,是否有一种方法可以指定传入数据的格式(例如,告诉 cups 它正在接收的是“纯文本”,即使它包含转义码)这样杯子就不会看它而只是将它传递给界面?

最佳答案

您拥有的打印队列不是“原始”打印队列!

首先,您似乎不知道 CUPS 中的原始打印队列是什么:原始队列是与...无关的队列。

  • ...既不是接口(interface)脚本(与位于 /etc/cups/interfaces/ 中的队列本身同名的脚本),

  • ...也不是 PostScript 打印机描述 (PPD) 文件(与队列本身同名的 PPD 文件,带有附加后缀 *.ppd,位于 /etc/cups/ppd/)。

既然你说你已经为你的打印机队列安装了一个接口(interface)脚本,根据定义这些是不是原始队列!

要将作业作为原始(即:未过滤)发送到非原始 CUPS 队列,除了在 lp 命令行上使用 -o raw 之外别无他法.您也可以(替代地)使用选项 -o document-format=application/vnd.cups-raw... 但这具有完全相同的含义:它导致 CUPS 使用相同的作业处理和只需多出 7 倍的键盘按键即可。

两种方式都会导致 CUPS 跳过自动输入传入作业文件的步骤,并将其未经过滤地传递到队列的后端。

可以在日志文件 /var/log/cups/error_log 中通过查找关键字 Auto-typing 查看自动输入步骤及其结果cupsd.conf 启用了 LogLevel debug:提到 Request file type is ... 的行告诉您 CUPS 将传入作业分类为哪种 MIME 类型.)

如何强制 CUPS 将传入的打印数据作为文本处理

lp 命令行中使用 -o document-format=text/plain

如何设置 CUPS“原始”队列

如果您想将(任何)现有的打印队列转换为原始打印队列,只需删除关联的 PPD 文件 (/etc/cups/ppd/myprinter.ppd) 或关联的接口(interface)脚本 ( /etc/cups/interfaces/myprinter).

如果您想从一开始就安装一个打印队列作为原始队列,只需使用打印机名称和后端 URI,但不要指定任何 PPD 或任何与之关联的接口(interface)脚本:

安装“原始”打印队列的示例命令:

 sudo lpadmin -p my_raw_printer -E -v socket://192.168.177.188:9100

(-p是指定打印队列名称,-E是从头开始启用打印队列。)

推测:为什么第二个应用程序可能会绕过您的接口(interface)脚本

如果不查看完整的系统设置并查看第二个应用程序(其打印行为似乎与第一个应用程序不同),或者不访问调试级别的 CUPS error_log 文件,则只能推测:

  • 我的猜测是您的第二个应用程序使用一些硬连线打印命令,该命令隐式使用 -o raw 打印命令选项。

关于linux - CUPS绕过接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12271871/

相关文章:

linux - 无法识别的规则 lex 中的错误

java - 我在 java 中遇到问题,无法打印所有 swing 组件

linux - 子类型和 mDNSResponder

python 库依赖错误 :pkg_resources. DistributionNotFound: pycups

ubuntu - HPLIP 通过 PHP 发送传真

linux - 我无法解决此 bash 脚本中的语法错误(版本 4.1.2)

python - 是否可以在 CLI 中修改 json 对象?

c++ - 声音 API Ubuntu Linux

java - 热敏打印机java

Python here 文档在顶部和底部没有换行符