Printing 用netcat打印postscript

Printing 用netcat打印postscript,printing,postscript,netcat,Printing,Postscript,Netcat,如何使用netcat程序与联网postscript打印机进行双向通信?Postscript程序经常向标准输出发送信息,这很难通过网络捕获。我需要与打印机9100端口进行双向通信。我的答案如下。有人知道更好的方法吗?netcat程序可用于与postscript打印机的双向通信 我一直在使用一些简单的程序将打印作业直接发送到网络postscript打印机,直到现在才从打印机获得任何返回信息。我喜欢直接与打印机通信,而不是将作业发送到后台处理程序 有一些地方关于使用netcat打印的信息非常稀少,所以

如何使用netcat程序与联网postscript打印机进行双向通信?Postscript程序经常向标准输出发送信息,这很难通过网络捕获。我需要与打印机9100端口进行双向通信。我的答案如下。有人知道更好的方法吗?

netcat程序可用于与postscript打印机的双向通信

我一直在使用一些简单的程序将打印作业直接发送到网络postscript打印机,直到现在才从打印机获得任何返回信息。我喜欢直接与打印机通信,而不是将作业发送到后台处理程序

有一些地方关于使用netcat打印的信息非常稀少,所以我正在制作这份报告

我的打印机是一台Xerox 6500n,通过以太网电缆连接到路由器。我可以通过多种方式将postscript程序或pdf文件直接发送到打印机。有时,我想从打印机中获取答案,因此需要一个测试程序来使用打印机使用“pathforall”转换输入并返回答案。netcat很好地做到了这一点:

nc -n 192.168.1.111 9100 < pathforall.ps

EDIT3:Postscript执行模式按照luser droog的建议,在Xerox 6500n上使用telnet。请参阅下面的评论。

这里有一个bash/dev/tcp替代方案,可以在不使用netcat的情况下进行打印。 这将使用bash发送到网络PostScript打印机(如果使用--enable-net重定向构建)。这适用于我的Void bash和施乐Phaser 6500n,并在PJL和PostScript之间切换。其他打印机的测试结果会有所帮助

#!/bin/bash
#
#   ++++   driverless postscript printing   ++++
#   bash needs --enable-net-redirections build option
#
# for postscript programs with postscript printer only
#
# bash escape is \033 or \e or \E or \x1B

exec 5<>/dev/tcp/192.168.1.111/9100 || exit 1     # change ip as needed

{
 echo -e "\E%-12345X@PJL"           # PJL entrance
 echo @PJL ECHO "$(date)"
 echo @PJL ECHO "setting up printer ..."
 echo @PJL COMMENT Change Printer Settings
 echo @PJL SET COPIES = 1           # modify environment settings
 echo @PJL SET MANUALFEED = off
 echo @PJL ECHO "Starting PostScript Program ..."
 echo @PJL ENTER LANGUAGE = POSTSCRIPT
 echo  "%!"                         # optional
cat "$1" || echo -E "(Hello World\n) print flush"   # if input.ps missing
 echo -e "\004"                     # ctrl-D for end of file
 echo -e "\e%-12345X@PJL"           # back to PJL
 echo @PJL ECHO "Finished PostScript Program."
 echo @PJL RESET                    # unset modified environment settings
 echo @PJL ECHO BYE.
 echo -e "\033%-12345X"             # PJL universal exit
} >&5                               # send to printer

while read -t 122 -r LINE            # timeout after 122 seconds of silence
do
  echo "$LINE"
if [[ "$LINE" =~ @PJL\ ECHO\ BYE. ]]; then break; fi
done <&5

echo "Finished reading printer"

exec 5>&-                           # close
exec 5<&-                           # close both
exit 0

更新:我在这里添加了这个:

所以。。。。你的问题到底是什么?有没有更好的主意?对不起,我不明白这个问题。你已经说明了你在做什么,但你没有问任何问题,也没有说你有什么问题。在不知道您目前的方法存在哪些问题的情况下,如何提供“更好的想法”呢?这更像是使用netcat进行双向打印的指导。在互联网上搜索时,除了简单的收据打印机(不带postscript且不将输出发送回计算机)之外,没有其他报告。我已经得到了双向打印串行和并行端口,当使用lpr后台处理程序发送输出到错误通道。我有python程序支持双向通信以捕获postscript输出,除了netcat这样简单的东西。您有没有更好的方法来捕获postscript程序“print”命令的返回输出?IMO发布教程不是堆栈溢出的原因。这是一个寻求编程问题帮助的网站。你最好写一个问题,然后贴出你自己的答案。仅仅把“怎么做”作为一个问题是不合适的。非常酷。如果您可以从stdin连接输入,请尝试键入
executive
,然后按几次enter键。它可能会给你一个提示。(以前使用telnet与HP激光打印机进行类似的交互。)感谢您提供的信息。我尝试再次使用netcat与打印机stdin进行交互,但没有任何影响。我还安装了telnet,并在端口9100上进行了实验,没有任何响应。上面的edit2显示了我让打印机发送提示的位置,除非它不响应stdin。许多年前,我将NetTalk用于appletalk协议,效果很好,只是这是一个安装复杂的大型程序,现在在我的Void linux发行版中不可用。到目前为止,我更喜欢netcat。可能类似于
cat executive.ps-|nc IP 9100
。或者只运行
nc
,无需重定向。它应该接受打字。您使用的命令重定向stdin,使其不再连接到键盘。但我认为运行程序的其他方式应该允许它工作。我仍然认为它应该工作,但我遗漏了一些额外的令人困惑的细节。连接通常是在打印机端没有回音的情况下开始的,因此它不会在您键入时显示字母。此外,打印机需要看到至少2个回车,因此,如果键盘侧使用行缓冲(可能),则需要按enter键3次,打印机才能看到前2。。。但既然你不需要这个,就不要为了我而继续尝试。仅供参考。谢谢卢瑟·德罗格。telnet可以按照您的建议获得执行模式。我没能从社邦的后记开始。我的错。
%!
(Hello World\n) print flush
#!/bin/bash
#
#   ++++   driverless postscript printing   ++++
#   bash needs --enable-net-redirections build option
#
# for postscript programs with postscript printer only
#
# bash escape is \033 or \e or \E or \x1B

exec 5<>/dev/tcp/192.168.1.111/9100 || exit 1     # change ip as needed

{
 echo -e "\E%-12345X@PJL"           # PJL entrance
 echo @PJL ECHO "$(date)"
 echo @PJL ECHO "setting up printer ..."
 echo @PJL COMMENT Change Printer Settings
 echo @PJL SET COPIES = 1           # modify environment settings
 echo @PJL SET MANUALFEED = off
 echo @PJL ECHO "Starting PostScript Program ..."
 echo @PJL ENTER LANGUAGE = POSTSCRIPT
 echo  "%!"                         # optional
cat "$1" || echo -E "(Hello World\n) print flush"   # if input.ps missing
 echo -e "\004"                     # ctrl-D for end of file
 echo -e "\e%-12345X@PJL"           # back to PJL
 echo @PJL ECHO "Finished PostScript Program."
 echo @PJL RESET                    # unset modified environment settings
 echo @PJL ECHO BYE.
 echo -e "\033%-12345X"             # PJL universal exit
} >&5                               # send to printer

while read -t 122 -r LINE            # timeout after 122 seconds of silence
do
  echo "$LINE"
if [[ "$LINE" =~ @PJL\ ECHO\ BYE. ]]; then break; fi
done <&5

echo "Finished reading printer"

exec 5>&-                           # close
exec 5<&-                           # close both
exit 0
$ ./print.sh
cat: '': No such file or directory
@PJL ECHO Mon 20 Apr 2020 07:10:03 AM PDT

@PJL ECHO setting up printer ...

@PJL ECHO Starting PostScript Program ...

Hello World
@PJL ECHO Finished PostScript Program.

@PJL ECHO BYE.
Finished reading printer