old-www/HOWTO/Printing-HOWTO/x1751.htm

916 lines
19 KiB
HTML

<HTML
><HEAD
><TITLE
>Networks</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.7"><LINK
REL="HOME"
HREF="t1.htm"><LINK
REL="PREVIOUS"
TITLE="Ghostscript."
HREF="x1687.htm"><LINK
REL="NEXT"
TITLE="Windows-only printers"
HREF="x2005.htm"></HEAD
><BODY
CLASS="sect1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
></TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x1687.htm"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x2005.htm"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="network"
></A
>Networks</H1
><A
NAME="AEN1753"
></A
><P
>One of the features of most spoolers is that they support printing
over the network to printers physically connected to a different
machine, or to the network directly. With the careful combination
of filter scripts and assorted utilities, you can print
transparently to printers on all sorts of networks.</P
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="network-to-unix"
></A
>Printing to a Unix/lpd host</H2
><A
NAME="AEN1758"
></A
><A
NAME="AEN1761"
></A
><A
NAME="AEN1764"
></A
><P
>To allow remote machines to print to your printer using the LPD
protocol, you must list the machines in<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>/etc/hosts.equiv</I
></SPAN
> or<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>/etc/hosts.lpd</I
></SPAN
>. (Note that<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>hosts.equiv</I
></SPAN
> has a host of other effects; be
sure you know what you are doing if you list any machine there).
You can allow only certain users on the other machines to print to
your printer by using the <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>rs</I
></SPAN
> attribute; read
the <TT
CLASS="literal"
><A
HREF="http://www.linuxprinting.org/man/lpd.8.html"
TARGET="_top"
>lpd</A
></TT
> man page for information on this.</P
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="network-to-unix-with-lpd"
></A
>With <TT
CLASS="literal"
>lpd</TT
></H3
><P
>To print to another machine, you make an<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>/etc/printcap</I
></SPAN
> entry like this:<PRE
CLASS="screen"
>&#13;# REMOTE djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:sh:</PRE
>
Note that there is still a spool directory on the local machine
managed by <TT
CLASS="literal"
>lpd</TT
>. If the remote
machine is busy or offline, print jobs from the local machine
wait in the spool area until they can be sent.</P
></DIV
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="network-to-unix-with-rlpr"
></A
>With <TT
CLASS="literal"
>rlpr</TT
></H3
><A
NAME="AEN1784"
></A
><A
NAME="AEN1786"
></A
><P
>You can also use <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>rlpr</I
></SPAN
> to send a print job
directly to a queue on a remote machine without going through the
hassle of configuring lpd to handle it. This is mostly useful in
situations where you print to a variety of printers only
occasionally. From the announcement for<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>rlpr</I
></SPAN
>:</P
><P
>Rlpr uses TCP/IP to send print jobs to lpd servers anywhere on a
network.</P
><P
>Unlike lpr, it *does not* require that the remote printers be
explicitly known to the machine you wish to print from,
(e.g. through <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>/etc/printcap</I
></SPAN
>) and thus is
considerably more flexible and requires less administration.</P
><P
>rlpr can be used anywhere a traditional lpr might be used, and is
backwards compatible with traditional BSD lpr.</P
><P
>The main power gained by rlpr is the power to print remotely
*from anywhere to anywhere* without regard for how the system you
wish to print from was configured. Rlpr can work as a filter
just like traditional lpr so that clients executing on a remote
machine like netscape, xemacs, etc, etc can print to your local
machine with little effort.</P
><P
>Rlpr is available from <TT
CLASS="literal"
><A
HREF="ftp://metalab.unc.edu/pub/Linux/system/printing/"
TARGET="_top"
>Metalab</A
></TT
>.</P
></DIV
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="network-to-windows"
></A
>Printing to a Windows or Samba printer</H2
><A
NAME="AEN1802"
></A
><A
NAME="AEN1805"
></A
><P
>There is a Printing to Windows mini-HOWTO out there which has more
info than there is here.</P
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="network-to-windows-with-lpd"
></A
>From LPD</H3
><A
NAME="AEN1811"
></A
><P
>It is possible to direct a print queue through the <TT
CLASS="literal"
><A
HREF="http://www.linuxprinting.org/man/smbclient.1.html"
TARGET="_top"
>smbclient</A
></TT
> program (part of the Samba suite)
to a TCP/IP based SMB print service. Samba includes a script to
do this called <TT
CLASS="literal"
>smbprint</TT
>. In short,
you put a configuration file for the specific printer in question
in the spool directory, and install the <TT
CLASS="literal"
>smbprint</TT
> script as the<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>if</I
></SPAN
>.</P
><P
>The <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>/etc/printcap</I
></SPAN
> entry goes like this:<PRE
CLASS="screen"
>&#13;lp|remote-smbprinter:\
:sh:\
:lp=/dev/null:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:</PRE
></P
><P
>You should read the documentation inside the <TT
CLASS="literal"
>smbprint</TT
> script for more information on how
to set this up.</P
><P
>You can also use <TT
CLASS="literal"
>smbclient</TT
> to
submit a file directly to an SMB printing service without
involving <TT
CLASS="literal"
>lpd</TT
>. See the man page.</P
></DIV
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="network-to-netware"
></A
>Printing to a NetWare Printer</H2
><A
NAME="AEN1830"
></A
><A
NAME="AEN1833"
></A
><P
>The ncpfs suite includes a utility called <TT
CLASS="literal"
>nprint</TT
> which provides the same functionality
as <TT
CLASS="literal"
>smbprint</TT
> but for NetWare. You
can get ncpfs from <A
HREF="ftp://metalab.unc.edu/pub/Linux/system/filesystems/ncpfs/"
TARGET="_top"
>Metalab</A
>. From the LSM entry for version 0.16:</P
><P
>&#13;<SPAN
CLASS="QUOTE"
>"With ncpfs you can mount volumes of your NetWare server under
Linux. You can also print to NetWare print queues and spool
NetWare print queues to the Un*x print spooler. You need
kernel 1.2.x or 1.3.54 and above. ncpfs does NOT work with any
1.3.x kernel below 1.3.54."</SPAN
>
</P
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="network-to-netware-with-lpd"
></A
>From LPD</H3
><A
NAME="AEN1844"
></A
><P
>To make <TT
CLASS="literal"
>nprint</TT
> work via lpd, you
write a little shell script to print stdin on the NetWare
printer, and install that as the <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>if</I
></SPAN
> for an
lpd print queue. You'll get something like:<PRE
CLASS="screen"
>&#13;sub2|remote-NWprinter:\
:sh:\
:lp=/dev/null:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:</PRE
>
The <TT
CLASS="literal"
>nprint-script</TT
> might look
approximately like:<PRE
CLASS="screen"
>&#13;#! /bin/sh
# You should try the guest account with no password first!
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -</PRE
></P
></DIV
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="network-to-apple"
></A
>Printing to an EtherTalk (Apple) printer</H2
><A
NAME="AEN1855"
></A
><A
NAME="AEN1858"
></A
><P
>The netatalk package includes something like <TT
CLASS="literal"
>nprint</TT
> and <TT
CLASS="literal"
>smbclient</TT
>. Others have documented the
procedure for printing to and from an Apple network far better
than I ever will; see the <A
HREF="http://thehamptons.com/anders/netatalk/"
TARGET="_top"
>Linux
Netatalk-HOWTO</A
>.</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="networked-printers"
></A
>Printing to a networked printer</H2
><A
NAME="AEN1867"
></A
><A
NAME="AEN1870"
></A
><A
NAME="AEN1873"
></A
><P
>Many printers come with an ethernet interface which you can print
to directly, typically using the LPD protocol. You should
follow the instructions that came with your printer or its network
adaptor, but in general, such printers are "running" lpd, and
provide one or more queues which you can print to. An HP, for
example, might work with a printcap like:<PRE
CLASS="screen"
>&#13;lj-5|remote-hplj:\
:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:\
:rp=raw:</PRE
></P
><P
>HP Laserjet printers with JetDirect interfaces generally support
two built in lpd queues - "raw" which accepts PCL (and possibly
Postscript) and "text" which accepts straight ascii (and copes
automatically with the staircase effect). If you've got a
JetDirect Plus3 three-port box, the queues are named "raw1",
"text2", and so forth.</P
><P
>Note that the ISS company has identified an assortment of denial
of service attacks which hang HP Jetdirect interfaces. Most of
these have been addressed beginning in Fall 98. These sorts of
problems are common in embedded code; few appliance-style devices
should be exposed to general Internet traffic.</P
><A
NAME="AEN1880"
></A
><P
>In a large scale environment, especially a large environment where
some printers do not support PostScript, it may be useful to
establish a dedicated print server to which all machines print and
on which all ghostscript jobs are run. This will allow the queue
to be paused or reordered using the topq and lprm commands.</P
><P
>This also allows your GNU/Linux box to act as a spool server for the
printer so that your network users can complete their print jobs
quickly and get on with things without waiting for the printer to
print any other job that someone else has sent. This is suggested
too if you have unfixable older HP Jetdirects; it reduces the
likelihood of the printers wedging.</P
><P
>To do this, set up a queue on your linux box that points at the
ethernet equipped HP LJ (as above). Now set up all the clients on
your LAN to point at the LPD queue (eg lj-5 in the example above).</P
><P
>Some HP network printers apparently don't heed the banner page
setting sent by clients; you can turn off their internally
generated banner page by telnetting to the printer, hitting return
twice, typing "banner: 0" followed by "quit". There are other
settings you can change this way, as well; type "?" to see a list.</P
><P
>The full range of settings can be controlled with HP's <A
HREF="http://www.hp.com/go/webjetadmin"
TARGET="_top"
>webJetAdmin</A
>
software. This package runs as a daemon, and accepts http
requests on a designated port. It serves up forms and Java
applets which can control HP printers on the network. In theory,
it can also control Unix print queues, but it does so using the
rexec service, which is completely unsecure. I don't advise using
that feature.</P
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="networked-printers-appsocket"
></A
>To AppSocket Devices</H3
><A
NAME="AEN1891"
></A
><A
NAME="AEN1893"
></A
><A
NAME="AEN1896"
></A
><A
NAME="AEN1899"
></A
><P
>Some printers (and printer networking "black boxes") support only
a cheesy little non-protocol involving plain TCP connections;
this is sometimes called the "AppSocket" protocol. Notable in
this category are early-model JetDirect (including some
JetDirectEx) cards. Basically, to print to the printer, you must
open a TCP connection to the printer on a specified port
(typically 9100, or 9100, 9101 and 9102 for three-port boxes) and
stuff your print job into it. LPRng has built-in support for
stuffing print jobs into random TCP ports, but with BSD lpd it's
not so easy. The best thing is probably to obtain and use the
little utility called netcat.</P
><P
>Failing that, it can be implemented, among other ways, in Perl
using the program below. For better performance, use the
program netcat ("nc"), which does much the same thing in a
general purpose way. Most distributions should have netcat
available in prepackaged form.</P
></DIV
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="if-for-remote-printers"
></A
>Running an <TT
CLASS="option"
>if</TT
> for remote printers with old
LPDs</H2
><A
NAME="AEN1907"
></A
><A
NAME="AEN1911"
></A
><P
>One oddity of older versions of lpd is that the <TT
CLASS="option"
>if</TT
>
is not run for remote printers. (Versions after 0.43 or so have
the change originated on FreeBSD such that the <TT
CLASS="option"
>if</TT
>
is always run). If you find that you need to run an<TT
CLASS="option"
>if</TT
> for a remote printer, and it isn't working
with your lpr, you can do so by setting up a double queue and
requeueing the job. As an example, consider this<TT
CLASS="filename"
>printcap</TT
>:</P
><P
>&#13;<PRE
CLASS="programlisting"
>&#13;lj-5:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:if=/usr/lib/lpd/filter-lj-5:
lj-5-remote:sh:rm=printer.name.com:\
:rp=raw:sd=/var/spool/lpd/lj-5-raw:
</PRE
>in light of this <B
CLASS="command"
>filter-lj-5</B
> script:<PRE
CLASS="programlisting"
>&#13;#!/bin/sh
gs &#60;options&#62; -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5
</PRE
></P
><P
>The <TT
CLASS="option"
>-U</TT
> option to lpr only works if lpr is run
as daemon, and it sets the submitter's name for the job in the
resubmitted queue correctly. You should probably use a more
robust method of getting the username, since in some cases it is
not argument 5. See the man page for <TT
CLASS="filename"
><TT
CLASS="replaceable"
><I
><A
HREF="http://www.linuxprinting.org/man/printcap.5.html"
TARGET="_top"
>printcap</A
></I
></TT
></TT
>.</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="network-from-windows"
></A
>From Windows.</H2
><A
NAME="AEN1931"
></A
><A
NAME="AEN1934"
></A
><A
NAME="AEN1938"
></A
><A
NAME="AEN1941"
></A
><P
>Printing from a Windows (or presumably, OS/2) client to a Un*x
server is directly supported over SMB through the use of the
SAMBA package, which also supports file sharing of your Un*x
filesystem to Windows clients.</P
><P
>Samba includes fairly complete documentation, and there is a good
Samba FAQ which covers it, too. You can either configure a magic
filter on the Un*x box and print PostScript to it, or run around
installing printer-specific drivers on all the Windows machines
and having a queue for them with no filters at all. Relying on
the Windows drivers may in some cases produce better output, but
is a bit more of an administrative hassle if there are many
Windows boxes. So try Postscript first. Modern versions of
Samba should support the automagical driver download mechanism
offered by Windows NT servers to deal with this problem.</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="networks-from-apple"
></A
>From an Apple.</H2
><A
NAME="AEN1947"
></A
><A
NAME="AEN1950"
></A
><A
NAME="AEN1953"
></A
><A
NAME="AEN1955"
></A
><P
>Netatalk supports printing from Apple clients over EtherTalk. See
the <A
HREF="http://thehamptons.com/anders/netatalk/"
TARGET="_top"
>Netatalk
HOWTO Page</A
> for more information.</P
><P
>Really, though, any modern Mac can print over TCP/IP using the LPD
protocol just fine. UVa provides a very nice <A
HREF="http://www.itc.virginia.edu/desktop/mac/ip_printing/ip_printing.html"
TARGET="_top"
>support page</A
> detailing how to set this up.</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="networks-from-netware"
></A
>From Netware.</H2
><A
NAME="AEN1965"
></A
><A
NAME="AEN1968"
></A
><A
NAME="AEN1971"
></A
><A
NAME="AEN1973"
></A
><P
>The ncpfs package includes a daemon named pserver which can be
used to provide service to a NetWare print queue. From what I
understand, this system requires a Bindery-based NetWare, eg 2.x,
3.x, or 4.x with bindery access enabled.</P
><P
>For more information on ncpfs and it's pserver program, see <A
HREF="ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/"
TARGET="_top"
>the ncpfs FTP
site</A
>.</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="AEN1980"
></A
>Networked Printer Administration</H2
><A
NAME="AEN1982"
></A
><A
NAME="AEN1985"
></A
><P
>Most networked printers support some method of remote
administration. Often there are easy-to-use web pages for
configuration. More usefully, there is often support for SNMP
management. Typically you can find out interesting information on
printer status like ink and paper levels, print volumes, and so
forth, and you can usually change certain settings. SNMP printer
control, and a number of other printing-related things, are being
standardized by the IEEE's <A
HREF="http://www.pwg.org/"
TARGET="_top"
>Printer Working Group</A
></P
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="npadmin"
></A
><B
CLASS="command"
>npadmin</B
></H3
><P
>&#13;<A
HREF="http://npadmin.sourceforge.net/"
TARGET="_top"
>Npadmin</A
>is a
command-line program which offers an interface to the common SNMP
functionality of networked printers. It implements the standard <A
HREF="http://www.ietf.org/rfc/rfc1759.txt"
TARGET="_top"
>Printer
MIB</A
>, as well as a few vendor-proprietary schemes used
mainly for older devices. Both printer-discovery style actions
and various printer status queries are supported.</P
><P
>npadmin has an excellent <A
HREF="http://npadmin.sourceforge.net/man/"
TARGET="_top"
>man page</A
>, and
precompiled packages are distributed for a number of RPM and dpkg
based distributions.</P
></DIV
><DIV
CLASS="sect3"
><H3
CLASS="sect3"
><A
NAME="AEN1997"
></A
>Other SNMP tools</H3
><P
>Besides npadmin, there are a number of SNMP tools that will be
useful. <B
CLASS="command"
>snmptraplogd</B
> can log SNMP trap
events. This is useful for observing printer jams, out of paper
events, etc; it would be straightforward to retransmit certain
events to a pager, or to send an email.</P
><P
>While npadmin provides simplified support for many network
printers' SNMP interfaces, some printers may have vendor
extensions which npadmin doesn't know about. In this case, you
can use the CMU SNMP tools, which support arbitrary SNMP GET and
SET operations, as well as walks and the like. With these, and a
bit of work, you can make use of any SNMP feature offered by your
printer's MIB. You may need to obtain a MIB from your vendor to
figure out what all the variables are; sometimes vendors think
that people actually use the proprietary tools they ship.</P
><P
>VA Linux's <B
CLASS="command"
><A
HREF="http://sourceforge.net/project/?group_id=3648"
TARGET="_top"
>libprinterconf</A
></B
> includes code to perform
network printer discovery. Printers are identified against a
compiled-in library of printer signatures; at the moment the
library is not large, but does cover many common networked
printer models.</P
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x1687.htm"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="t1.htm"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x2005.htm"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Ghostscript.</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Windows-only printers</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>