SDB:Printing via TCP/IP network

跳转到:导航搜索

本文适用于 Linux 下 CUPS 版本高达 2.x,以及那里的传统过滤系统和后端。

如今的无驱动程序打印工作流程则大不相同。

术语和定义

具有TCP/IP网络连接以及一个或多个并行或USB连接的专用设备,用于并行端口或USB打印机,称为打印服务器盒。

具有内置TCP/IP网络接口的打印机称为网络打印机。基本上,网络打印机内置了一个打印服务器盒。

因此,设置网络打印机和打印服务器盒是相同的。

与打印服务器盒不同,打印服务器机器是指提供打印服务的真实计算机。

提交作业的计算机称为客户端或更准确地说,客户端机器。

先决条件

打印机必须受 openSUSE 支持,请参阅 SDB:Installing a Printer

其他文档

请参阅“参考”手册,特别是从openSUSE 11.1开始,请阅读YaST打印机设置对话框“通过网络打印”和“共享打印机”的帮助文本,即 YaST 打印机模块

网络打印机设置

连接决定了数据发送到打印机设备的方式。如果使用了错误的连接,则无法将数据发送到设备,因此无法进行任何打印。

连接被指定为所谓的设备URI,请参阅 SDB:CUPS in a Nutshell 的“后端”部分。它的第一个词(所谓的URI方案)指定了数据传输的类型,例如“parallel”、“usb”、“socket”、“lpd”或“ipp”。在方案之后,还有或多或少的附加部分(由斜杠 '/' 字符分隔),这些部分指定了这种数据传输的细节。

打印服务器盒和网络打印机通过三种不同的网络协议访问。请参阅您的网络打印机或打印服务器盒的手册,了解您的特定设备支持哪些协议

TCP端口 (AppSocket/JetDirect)

需要IP地址和端口号才能访问它。通常端口号9100是正确的。它是最简单、最快且通常最可靠的协议。匹配的设备URI是

socket://ip-address:port-number

例如,具有IP地址192.168.100.1且可通过端口9100访问的网络打印机可能具有如下设备URI:socket://192.168.100.1:9100

行打印机守护进程 (LPD) 协议

LPD在设备上运行并提供一个或多个LPD队列。需要IP地址和LPD队列名称才能访问它。几乎所有网络打印机和打印服务器盒都支持它。通常,任意队列名称或“LPT1”都可以正常工作。但是,使用正确的LPD队列,而不会以某种方式更改数据或添加额外的换页符或页眉,对于可靠打印至关重要。匹配的设备URI是

lpd://ip-address/queue

例如,具有IP地址192.168.100.2且可通过LPD协议访问,具有远程LPD队列名称“lpt1”的网络打印机可能具有如下设备URI:lpd://192.168.100.2/lpt1

互联网打印协议 (IPP)

IPP是CUPS的原生协议,CUPS在真实的计算机上运行,但是当IPP在小型打印服务器盒或网络打印机中实现时,通常没有正确实现。仅当供应商实际记录对它的官方支持时才使用IPP。匹配的设备URI是

ipp://ip-address:port-number/resource

关于“端口号”和“资源”的确切含义完全取决于特定的网络打印机或打印服务器盒型号。有关更多信息,请参阅 openprinting.github.io/cups上的使用网络打印机

出现问题时

通过USB直接连接打印机设备,并将其配置为本地打印机,以进行测试,以排除与网络相关的问题。

无线网络的情况

当通过USB打印有效但通过无线网络打印无效时,通过传统的有线网络电缆连接设备,然后重新进行打印机设置,以测试通过传统的有线网络打印是否有效。

理论上来说,不应该使用哪种类型的网络连接(无线与有线网络连接)有什么区别 - 只要特定的网络连接可靠地工作。实际上,至少对于打印机设备而言,无线网络连接通常不如传统的有线网络连接可靠。

此外,无线网络可能不安全,请参阅 SDB:CUPS_and_SANE_Firewall_settings

网络打印机或打印服务器盒无法可靠工作

有时打印服务器盒或网络打印机上的打印假脱机程序会出现问题,尤其是在多个客户端同时向打印服务器盒或网络打印机发送打印作业时。在这种情况下,打印服务器盒或网络打印机上的打印假脱机程序可能会感到困惑。由于这取决于打印服务器盒或网络打印机中的打印假脱机程序,因此几乎不可能解决这些问题。在这种情况下,建议将打印机直接连接到真实的打印服务器机器。

尽管如此,您可以通过以下步骤进行改进
一台计算机充当打印服务器盒或网络打印机的打印服务器。所有客户端将打印作业发送到此打印服务器,并且只有此打印服务器管理打印作业的假脱机并将它们(一次一个)发送到打印服务器盒或网络打印机。

最终,这相当于通过CUPS服务器打印

通过CUPS服务器打印

请参阅 SDB:CUPS in a Nutshell,特别是“在网络中配置CUPS”部分。

通过SMB (Samba) 共享或Windows共享打印

要访问SMB打印机共享,必须安装RPM软件包samba-client。该软件包提供了CUPS后端“smb”,它是指向实际将数据发送到SMB打印机共享的/usr/bin/smbspool程序的链接。需要服务器名称和打印机共享名称,以及可选的工作组名称才能访问它。此外,可能需要用户名和密码才能获得访问权限。匹配的完整设备URI是

smb://username:password@workgroup/server/printer

有关更多信息,请参阅“man smbspool”并参阅 SDB:通过SMB (Samba) 共享或Windows共享打印

通过传统的UNIX服务器 (LPR) 打印

行打印机守护进程 (LPD) 在传统的UNIX服务器上运行并提供一个或多个LPD队列。需要IP地址和LPD队列名称才能访问它。匹配的设备URI是

 lpd://ip-address/queue

通过Novell Netware打印服务器 (IPX) 打印

要访问Novell Netware打印服务器上的打印队列,必须安装RPM软件包ncpfs。ncpfs软件包存在于openSUSE 12.1以及SUSE Linux Enterprise 11。因此,从openSUSE 12.2和SUSE Linux Enterprise 12开始,不再支持通过Novell Netware打印服务器打印。ncpfs软件包提供了CUPS后端“novell”,它运行nprint程序,该程序实际将数据发送到Novell Netware打印队列。需要服务器名称和打印机队列名称才能访问它。此外,可能需要用户名和密码才能获得访问权限。匹配的设备URI是

novell://username:password@server/queue

有关更多信息,请参阅“man nprint”和RPM软件包ncpfs中的其他文档。

测试这些连接

yast2-printer RPM提供了测试脚本,以测试是否可以通过特定的连接类型进行访问。

请记住,这些脚本仅实现基本的通用测试,因此测试结果可能不正确。尽管如此,如果出现问题,这些测试可能会指示一个麻烦点。

测试TCP端口连接

要测试TCP端口连接,请运行

root@host# /usr/lib/YaST2/bin/test_remote_socket HOST PORT

将HOST替换为远程主机或网络打印机的IP地址或主机名。将PORT替换为远程主机或网络打印机上的端口号。

一个示例test_remote_socket脚本,用于测试TCP端口连接(注意 - 浏览器中可能显示很长的行被换行)

#! /bin/bash
MY_NAME=${0##*/}
HOST="$1"
[ -z "$HOST" ] && { echo "Usage: $MY_NAME HOST [PORT]" ; exit 1 ; }
PORT="$2"
[ -z "$PORT" ] && PORT=9100
if ( ( echo -n '' >/dev/tcp/$HOST/$PORT ) & PID=$! ; sleep 2 ; kill $PID ; wait $PID )
then if ( ( echo -en '\r' >/dev/tcp/$HOST/$PORT ) & PID=$! ; sleep 2 ; kill $PID ; wait $PID )
     then echo "Port $PORT on host $HOST accepts data"
          exit 0
     fi
     echo "Connection possible to port $PORT on host $HOST but does not accept data"
     exit 1
fi
echo "No connection possible to port $PORT on host $HOST"
exit 1

有关“... & PID=$! ; sleep 2 ; kill $PID ; wait $PID”的原因,请参阅 https://fate.opensuse.org/312491

测试LPD/LPR连接

要测试LPD/LPR连接,请运行

root@host# /usr/lib/YaST2/bin/test_remote_lpd HOST QUEUE

将HOST替换为远程主机或网络打印机的IP地址或主机名。将QUEUE替换为远程主机或网络打印机上的队列名称。

一个示例test_remote_lpd脚本,用于测试LPD/LPR连接(注意 - 浏览器中可能显示很长的行被换行)

#! /bin/bash
MY_NAME=${0##*/}
HOST="$1"
QUEUE="$2"
[ -z "$HOST" -o -z "$QUEUE" ] && { echo "Usage: $MY_NAME HOST QUEUE [TIMEOUT]" ; exit 1 ; }
TIMEOUT="$3"
[ -z "$TIMEOUT" ] && TIMEOUT=10
if ! ( ( echo -n '' >/dev/tcp/$HOST/515 ) & PID=$! ; sleep 2s ; kill $PID ; wait $PID )
then echo "No connection possible to LPD port 515 on host $HOST"
     exit 1
fi
echo "Connection possible to LPD port 515 on host $HOST"
export NETCAT=$( type -ap netcat | head -n 1 )
export FUSER=$( type -ap fuser | head -n 1 )
if test -z "$NETCAT" -o -z "$FUSER"
then echo "Cannot test if queue $QUEUE on host $HOST accepts print jobs because"
     [ -z "$NETCAT" ] && echo "netcat not executable"
     [ -z "$FUSER" ] && echo "fuser not executable"
     exit 1
fi
NETCAT_IN=$( mktemp -u /tmp/$MY_NAME.in.XXXXXX )
NETCAT_OUT=$( mktemp -u /tmp/$MY_NAME.out.XXXXXX )
mkfifo $NETCAT_IN
mkfifo $NETCAT_OUT
echo "Testing if queue $QUEUE on host $HOST accepts print jobs:"
PORT=$( for P in 721 722 723 724 725 726 727 728 729 730 731
        do $FUSER -n tcp $P &>/dev/null || { echo $P ; break ; }
        done )
if test -z "$PORT"
then echo "Failed to test if queue $QUEUE on host $HOST accepts print jobs"
     echo "because there is no LPD source port (721..731) available"
     exit 1
fi
# "\002$QUEUE\n" is a LPD request to receive a new job for $QUEUE
# The remote lpd sends '\000' if it accepts the request.
# Then we must send "\001\n" back which is a request to cancel the new job.
# As there may be no response from the remote port we have additionally
# a "kill $PID" time bomb which would kill the netcat process after $TIMEOUT.
$NETCAT -w $TIMEOUT -p $PORT $HOST 515 <$NETCAT_IN >$NETCAT_OUT 2>/dev/null &
PID=$!
{ sleep ${TIMEOUT}s ; kill $PID &>/dev/null ; } &
RESULT=""
{ echo -e "\002$QUEUE" ; \
  RESULT=$( head --bytes=1 <$NETCAT_OUT | tr '\000' '0' ) ; \
  [ "$RESULT" = "0" ] && echo -e "\001" ; } >$NETCAT_IN
rm $NETCAT_IN $NETCAT_OUT
[ "$RESULT" = "0" ] && { echo "Queue $QUEUE on host $HOST accepts print jobs" ; exit 0 ; }
# "\004$QUEUE\n" is a LPD request to receive $QUEUE status in long format.
echo "Queue $QUEUE on host $HOST does not accept print jobs"
echo "Status of the queue $QUEUE (possibly empty or not available):"
echo -e "\004$QUEUE" | $NETCAT -w $TIMEOUT -p $PORT $HOST 515
exit 1

有关LPD请求的详细信息,请参阅RFC 1179中的行打印机守护进程协议。

测试IPP/CUPS连接

要测试IPP/CUPS连接,请运行

root@host# /usr/lib/YaST2/bin/test_remote_ipp HOST QUEUE

将HOST替换为远程CUPS服务器的IP地址或主机名。将QUEUE替换为远程CUPS服务器上的队列名称。

测试SMB共享连接

要测试SMB共享连接,请运行

root@host# /usr/lib/YaST2/bin/test_remote_smb WORKGROUP HOST SHARE [USER] [PASSWORD]

将HOST替换为远程SMB服务器的IP地址或主机名。将WORKGROUP和SHARE替换为远程SMB服务器上的相应值,并使用其NetBIOS主机名,并在需要时提供用户名和密码进行身份验证。

测试Novell/IPX连接

要测试Novell/IPX连接,请运行

root@host# /usr/lib/YaST2/bin/test_remote_novell HOST QUEUE

将HOST替换为远程IPX服务器的IP地址或主机名。将QUEUE替换为远程IPX服务器上的队列名称。

更多信息

Portal:Printing