代码之家  ›  专栏  ›  技术社区  ›  beginner6789

用netcat打印后记

  •  0
  • beginner6789  · 技术社区  · 5 年前

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

    0 回复  |  直到 5 年前
        1
  •  2
  •   beginner6789    5 年前

    netcat程序可用于与postscript打印机进行双向通信。

    我一直在使用一些简单的程序将打印作业直接发送到网络postscript打印机,到目前为止还没有从打印机收到任何返回信息。我喜欢直接与打印机通信,而不是将作业发送到后台处理程序。

    关于用netcat打印的信息很少,所以我做这份报告。

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

    nc -n 192.168.1.111 9100 < pathforall.ps
    

    然后我得到了想要的回应。这已经过检查,与ghostscript输出类似,只是出于某种原因略有偏差:

    $ nc -v -w 5 -n 192.168.1.111 9100 < pathforall.ps
    192.168.1.111 9100 (hp-pdl-datastr) open
    28.6998 12.2999 moveto
    28.6998 9.29996 28.3998 8.09995 25.2998 6.59998 curveto
    24.3998 6.09998 21.2999 4.79999 19.0999 4.79999 curveto
    15.3999 4.79999 12.4999 7.89996 12.4999 12.5999 curveto
    12.4999 12.7999 lineto
    12.4999 16.1999 13.5999 21.7999 28.6998 26.7999 curveto
    closepath
    
    $ gs pathforall.ps
    GPL Ghostscript 9.50 (2019-10-15)
    Copyright (C) 2019 Artifex Software, Inc.  All rights reserved.
    This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY:
    see the file COPYING for details.
    Loading Times-Roman font from /usr/share/ghostscript/fonts/Times-Roman.pfa... 4824712 3114962 3833824 2546359 1 done.
    28.6184 12.2615 moveto
    28.6184 9.27632 28.3224 8.07977 25.2262 6.57484 curveto
    24.3257 6.08141 21.2418 4.78618 19.0461 4.78618 curveto
    15.3577 4.78618 12.4589 7.8824 12.4589 12.5576 curveto
    12.4589 12.7673 lineto
    12.4589 16.1472 13.5567 21.7352 28.6184 26.7188 curveto
    28.6184 12.2615 lineto
    closepath
    

    netcat允许我与打印机进行类似于ghostscript的通信,只是我还没有启动执行模式。此外,请确保在postscript中包含“flush”命令,以将整个答案发送回。 这可用于从打印机获取信息的多种目的。

    编辑:这里有一个简单的测试,看看打印机STDOUT是否正在返回计算机:

    %!
    (Hello World\n) print flush
    

    EDIT3:正如luser droog所建议的那样,后记执行模式使用telnet在Xerox 6500n上运行。请参阅下面的评论。

        2
  •  1
  •   beginner6789    5 年前

    这里有一个bash/dev/tcp替代方案,用于在没有netcat的情况下进行打印。 如果使用--enable-net重定向构建,则使用bash将其发送到网络PostScript打印机。这适用于我的Void bash和Xerox 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
    

    这是我终端中的结果。一定要发送一个类似“print.sh input.ps”的文件,否则会发生这种情况:

    $ ./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
    

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