<HTML> <HEAD> <TITLE>L'impression à distance</TITLE> </HEAD> <BODY> <H1>12. <A NAME="s12"></A>L'impression à distance</H1> <P> <A HREF="Printing-HOWTO.html#toc12">Contenu de cette section</A></P> <P></P> <P>Une des caractéristiques de <CODE>lpd</CODE> est qu'il supporte l'impression sur des imprimantes rattachées à d'autres machines que la vôtre. Avec, en plus, une combinaison de filtres soignée, vous aurez un système d'impression transparent, réparti et performant.</P> <P></P> <H2>12.1 <A NAME="ss12.1"></A> Vers un hôte Unix/lpd</H2> <P></P> <P>Pour que des machines distantes puissent utiliser l'imprimante attachée à votre machine, le nom de ces machines doit être référencé soit dans le fichier <CODE>/etc/hosts.lpd</CODE>, soit dans le fichier <CODE>/etc/hosts.equiv</CODE>. Ce sont des fichiers textes normaux, dans lesquels on indique un nom de machine par ligne.</P> <P></P> <P></P> <P>Il est préférable de déclarer les machines dans <CODE>/etc/hosts.lpd</CODE> qui est spécialement réservé à l'impression, le fichier <CODE>/etc/hosts.equiv</CODE> donnant des droits plus étendus.</P> <P></P> <P></P> <P>Vous pouvez restreindre les droits d'accès distants par groupe ou par utilisateur. Les groupes autorisés sont indiqués grâce au paramètre <CODE>:rg=:</CODE> du fichier <CODE>printcap</CODE>: <CODE>rg=admin</CODE> restreint l'utilisation aux utilisateurs du groupe <CODE>admin</CODE>. Le paramètre booléen <CODE>:rs=:</CODE> du même fichier restreint l'accès aux utilisateurs ayant un compte sur votre machine.</P> <P></P> <H3>Avec lpd</H3> <P></P> <P>Pour imprimer vers une autre machine, vous devez créer une entrée <CODE>printcap</CODE> telle que:</P> <P> <BLOCKQUOTE><CODE> <PRE> # REMOTE djet500 lp|dj|deskjet:\ :sd=/var/spool/lpd/dj:\ :rm=machine.out.there.com:\ :rp=printername:\ :lp=/dev/null:\ :sh: </PRE> </CODE></BLOCKQUOTE> </P> <P>Vous noterez qu'il doit bien exister un répertoire de spool local géré par votre <CODE>lpd</CODE> local. Les fichiers soumis y seront copiés puis envoyés vers la machine distante.</P> <P></P> <H3>Avec rlpr</H3> <P></P> <P>Vous pouvez utiliser <CODE>rlpr</CODE> pour soumettre une impression directement à la machine distante sans passer par un démon local et toute sa configuration. C'est particulièrement intéressant lorsque vous imprimer rarement et vers différentes imprimantes.</P> <P></P> <P></P> <P><CODE>rlpr</CODE> s'appuie sur TCP/IP. Il n'est pas nécessaires que les imprimantes soient connues explicitement. N'ayant pas besoin de fichier printcap, il est plus facile à gérer. Il est compatible avec <CODE>lpr</CODE>.</P> <P></P> <H2>12.2 <A NAME="ss12.2"></A> Imprimer vers une imprimante attachée à Windows 95, NT,LanManager ou Samba.</H2> <P></P> <P>Il existe un mini-document (<CODE>Printing to Windows HOWTO</CODE>) qui décrit ceci très bien.</P> <P></P> <P></P> <P>Il est possible de rediriger une file <CODE>lpd</CODE> vers un service d'impression SMB grâce au programme <CODE>smbclient</CODE> (<CODE>http://www.picante.com/~gtaylor/pht/man/smbclient.html</CODE>). Samba contient un script (<CODE>smbprint</CODE>) qui fait cela. Vous devez mettre un fichier de configuration pour l'imprimante en question dans le répertoire de spool et décrire le programme <CODE>smbprint</CODE> en tant que filtre dans <CODE>/etc/printcap</CODE>:</P> <P> <BLOCKQUOTE><CODE> <PRE> lp|remote-smbprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lp:\ :if=/usr/local/sbin/smbprint: </PRE> </CODE></BLOCKQUOTE> </P> <P>Vous pouvez également utiliser le programme <CODE>smbclient</CODE> pour soumettre un fichier directement à un service d'impression SMB sans impliquer <CODE>lpd</CODE>. Lisez la documentation de tous ces programmes pour plus d'information.</P> <P></P> <H2>12.3 <A NAME="ss12.3"></A> Vers une imprimante NetWare</H2> <P></P> <P>La suite logicielle <CODE>ncpfs</CODE> contient un utilitaire appelé <CODE>nprint</CODE> qui fournit les mêmes fonctionnalités que smbprint pour NetWare. Vous pouvez l'obtenir sur <CODE>ftp://sunsite.unc.edu/pub/Linux/system/filesystems/ncpfs/</CODE>. Avec <CODE>ncpfs</CODE> vous pouvez monter des volumes du serveur NetWare sous Linux. Vous pouvez également soumettre des travaux d'impression vers NetWare ou mettre des travaux d'impression de NetWare en file sur votre système Linux. Vous devez disposer d'un noyaux 1.2.x ou 1.3.54 et ultérieur. <CODE>ncpfs</CODE> <B>NE</B> fonctionne <B>PAS</B> avec un noyau 1.3.x (x < 54).</P> <P></P> <P></P> <P>Pour que <CODE>nprint</CODE> fonctionne via <CODE>lpd</CODE>, vous devez écrire un shell-script pour diriger stdin sur l'imprimante NetWare. Vous l'installerez comme un filtre (<CODE>if</CODE>) d'une file d'impression <CODE>lpd</CODE>. Vous obtiendrez :</P> <P> <BLOCKQUOTE><CODE> <PRE> sub2|remote-NWprinter:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/sub2:\ :if=/var/spool/lpd/nprint-script: </PRE> </CODE></BLOCKQUOTE> </P> <P>le script <CODE>nprint-script</CODE> ressemble à quelque chose comme :</P> <P> <BLOCKQUOTE><CODE> <PRE> #! /bin/sh # Essayez en premier le compte invite (guest)sans mot de passe! /usr/local/bin/nprint -S net -U name -P passwd -q printq-name - </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <H2>12.4 <A NAME="ss12.4"></A> Vers une imprimante EtherTalk</H2> <P></P> <P>Le paquetage logiciel <CODE>netatalk</CODE> contient l'équivalent de <CODE>nprint</CODE> et <CODE>smbclient</CODE>. Référez-vous au <CODE>Netatalk-HOWTO</CODE> dans lequel est bien décrite la procédure d'impression vers et depuis un réseau <I>Apple</I>.</P> <P></P> <H2>12.5 <A NAME="ss12.5"></A> Vers une imprimante HP ou autre imprimante Ethernet</H2> <P></P> <P>Certaines imprimantes (HP et autres) sont fournies avec une interface Ethernet que vous pouvez directement adresser pour soumettre vos travaux d'impression. Conformez-vous au manuel du constructeur. En général, ces imprimantes font ``tourner'' un <CODE>lpd</CODE> et fournissent une ou plusieurs files vers lesquelles vous pouvez imprimer. Une imprimante HP, par exemple, pourra fonctionner avec une entrée <CODE>printcap</CODE> telle que:</P> <P> <BLOCKQUOTE><CODE> <PRE> lj-5|remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :rm=printer.name.com:rp=raw: </PRE> </CODE></BLOCKQUOTE> </P> <P>Les imprimantes LaserJet HP avec une interface JetDirect ont en général deux files incorporées; l'une ``raw'' accepte le PCL (et peut-être le PostScript), l'autre ``text'' accepte l'ascii pur (et s'arrange pour résoudre d'elle-même les problèmes d'effets d'escalier).</P> <P></P> <P></P> <P>Dans un environnement dans lequel plusieurs imprimantes ne supportent pas le <I>PostScript</I>, il peut être bon de configurer un serveur d'impression dédié vers lequel toutes les machines enverront leurs travaux et sur lequel GhostScript tournera.</P> <P></P> <H2>12.6 <A NAME="ss12.6"></A> Vers d'anciennes HP</H2> <P></P> <P>Certaines anciennes imprimantes HP ne supportent qu'un protocole mal foutu s'appuyant sur des connexions TCP, notamment les premièrs modèles à base de cartes JetDirect (et quelques JetDirectEx). Pour imprimer vers de telles imprimantes, vous devez ouvrir une connexion TCP vers un port dédié (9100) et envoyer votre impression vers cette connexion. Voici le script Perl correspondant :</P> <P> <BLOCKQUOTE><CODE> <PRE> #!/usr/bin/perl # Thanks to Dan McLaughlin for writing the original version of this # script (And to Jim W. Jones for sitting next to Dan when writing me # for help ;) $fileName = @ARGV[0]; open(IN,"$fileName") || die "Can't open file $fileName"; $dpi300 = "\x1B*t300R"; $dosCr = "\x1B&amp;k3G"; $ends = "\x0A"; $port = 9100 unless $port; $them = "bach.sr.hp.com" unless $them; $AF_INET = 2; $SOCK_STREAM = 1; $SIG{'INT'} = 'dokill'; $sockaddr = 'S n a4 x8'; chop($hostname = `hostname`); ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+$/;; ($name,$aliases,$type,$len,$thisaddr) = gethostbyname($hostname); ($name,$aliases,$type,$len,$thataddr) = gethostbyname($them); $this = pack($sockaddr, $AF_INET, 0, $thisaddr); $that = pack($sockaddr, $AF_INET, $port, $thataddr); if (socket(S, $AF_INET, $SOCK_STREAM, $proto)) { # print "socket ok\n"; } else { die $!; } # Give the socket an address. if (bind(S, $this)) { # print "bind ok\n"; } else { die $!; } # Call up the server. if (connect(S,$that)) { # print "connect ok\n"; } else { die $!; } # Set socket to be command buffered. select(S); $| = 1; select(STDOUT); # print S "@PJL ECHO Hi $hostname! $ends"; # print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends"; # print S $dpi300; # Avoid deadlock by forking. if($child = fork) { print S $dosCr; print S $TimesNewR; while (<IN>) { print S; } sleep 3; do dokill(); } else { while(<S>) { print; } } sub dokill { kill 9,$child if $child; } </PRE> </CODE></BLOCKQUOTE> </P> <P></P> <H2>12.7 <A NAME="ss12.7"></A> Les filtres d'entrée pour des imprimantes distantes</H2> <P></P> <P>Une des bizarreries de <CODE>lpd</CODE> est que le filtre d'entrée (<CODE>if</CODE>) n'est pas exécuté pour des imprimantes distantes. Si vous devez absolument passer par un filtre, il vous faudra utiliser deux files, la première redirigeant vers la deuxième. Par exemple :</P> <P> <BLOCKQUOTE><CODE> <PRE> lj-5:remote-hplj:\ :lp=/dev/null:sh:\ :sd=/var/spool/lpd/lj-5:\ :if=/usr/lib/lpd/filter-lj-5: lj-5-remote:lp=/dev/null:sh:rm=printer.name.com:\ :rp=raw:sd=/var/spool/lpd/lj-5-raw: </PRE> </CODE></BLOCKQUOTE> </P> <P>et le filtre <CODE>filter-lj-5</CODE> (exemple): </P> <P> <BLOCKQUOTE><CODE> <PRE> #!/bin/sh gs <options> -q -dSAFER -sOutputFile=- - | \ lpr -Plj-5-remote -U$5 </PRE> </CODE></BLOCKQUOTE> </P> <P>L'option <CODE>-U</CODE> ne fonctionne que si <CODE>lpr</CODE> est lancé en tant que démon. Elle positionne correctement le nom du soumissionnaire du travail dans la deuxième queue. Il serait d'ailleurs mieux d'utiliser une méthode plus sûre pour récupérer ce nom car ce n'est pas toujours le 5ème paramètre.</P> <P></P> <H2>12.8 <A NAME="ss12.8"></A> Imprimer depuis Windows</H2> <P></P> <P>L'impression depuis un client Windows vers un serveur Unix est directement supporté par <CODE>SMB</CODE> en utilisant le paquetage <CODE>SAMBA</CODE> (qui supporte également le partage de fichiers du système de fichiers Linux vers les clients Windows).</P> <P></P> <P></P> <P>Samba est fourni avec une documentation complète. Vous pouvez soit installer un filtre magique sur Linux et imprimer du <I>PostScript</I> soit installer un pilote d'imprimante spécifique sous Windows et décrire une file sans filtre. En s'appuyant sur les pilotes Windows, vous pourrez obtenir de meilleurs résultats, mais c'est un peu plus compliqué à administrer si vous avez plusieurs stations sous Windows. Donc essayez d'abord la première solution.</P> <P></P> <H2>12.9 <A NAME="ss12.9"></A> Depuis Netware</H2> <P></P> <P>Il y a des services NetWare disponibles pour Linux, mais je n'ai aucune idée si vous pouvez offrir des services d'impression depuis des client Netware. Des informations sont les bienvenues.</P> <P></P> <H2>12.10 <A NAME="ss12.10"></A> Depuis un Apple</H2> <P></P> <P>Netatalk permet d'imprimer depuis une station Apple sur EtherTalk. Voir le <CODE>Netatalk HOWTO</CODE> (<CODE>http://thehamptons.com/anders/netatalk</CODE>) pour de plus amples renseignements.</P> <P></P> <P></P> <H2>12.11 <A NAME="ss12.11"></A> Imprimer vers un fax</H2> <P></P> <P></P> <H3>Utiliser un modem/fax</H3> <P></P> <P>Si vous disposez d'un modem/fax, vous pouvez configurer votre système pour envoyer ou recevoir des fax aux formats <I>PostScript</I>, dvi, ascii, etc... Vous pourrez même faire en sorte que votre courrier électronique soit faxé!</P> <P></P> <P></P> <P>Les modems/Fax supportent les commandes de classe 1 ou 2. Les modems de classe 1 ont un sous-ensemble de fonctionnalités d'un fax disons traditionnel (donc, le logiciel doit faire le reste... et le coût de traitement est parfois critique!)</P> <P></P> <P></P> <P>La classe 1 correspond au standard EIA 578. Les modems de classe 2 répondent au sandard EIA 592. Vous trouverez dans la documentation de votre modem à quelle classe il appartient. Ne confondez pas classe et groupe. Le groupe est généralement le groupe III.</P> <P></P> <P></P> <P></P> <P>Les logiciels de fax tournant sous Linux doivent savoir convertir les données reçues en un format compatible avec le groupe III pour la transmission. Comme d'habitude <I>Ghostscript</I> sait faire ! Le pilote <CODE>tiffg3</CODE> génère des messages fax encodés au format <CODE>g3/tiff</CODE>. Vous devrez compiler et intégrer le pilote si ce n'est déjà fait.</P> <P></P> <P></P> <P>Un des logiciels les plus complets sur le sujet, <CODE>HylaFax</CODE> est disponible sur :</P> <P> <BLOCKQUOTE><CODE> <PRE> ftp.sgi.com:/sgi/fax/?????.src.tar.Z </PRE> </CODE></BLOCKQUOTE> </P> <P>Il supporte toutes sortes de choses comme les multiples modems et la diffusion.</P> <P></P> <P><CODE>mgetty + sendfax</CODE> est un couple de logiciels, contenant un <CODE>getty</CODE> pour Linux et les modems fax ainsi qu'un logiciel d'envoi de fax assez simple. Ce paquetage se trouve à:</P> <P> <BLOCKQUOTE><CODE> <PRE> sunsite.unc.edu:/pub/Linux/system/serial/getty/mgetty+sendfax-1.0.0.tar.gz </PRE> </CODE></BLOCKQUOTE> </P> <P>Enfin, <CODE>efax</CODE> mérite d'être mentionné. C'est un excellent choix pour Linux. Il supporte les classes 1 et 2.</P> <P> <BLOCKQUOTE><CODE> <PRE> sunsite.unc.edu:/pub/Linux/apps/serialcomm/fax/efax08a.tar.gz </PRE> </CODE></BLOCKQUOTE> </P> <P>(Répertoire dans lequel on trouvera également <CODE>vfax10.tar.z</CODE>, <CODE>qfax1.3.tar.gz</CODE>, <CODE>xfax.v1.07s.tar.gz</CODE>)</P> <P></P> <H3>Utiliser le service d'impression distant</H3> <P></P> <P>C'est un service expérimental vous permettant d'envoyer un courrier électronique que vous souhaitez imprimer sur un fax distant. Des formats tels que PostScript sont supportés. Bien que la couverture géographique de ce service soit très faible, il est très prometteur. Pour plus d'information, référez-vous au site Web ``Remote Printing WWW Site'' (<CODE>http://www.tpc.int/</CODE>).</P> <P></P> <P></P> <P></P> <HR> <P> Chapitre <A HREF="Printing-HOWTO-13.html">suivant</A>, Chapitre <A HREF="Printing-HOWTO-11.html">Précédent</A> <P> Table des matières de <A HREF="Printing-HOWTO.html#toc12">ce chapitre</A>, <A HREF="Printing-HOWTO.html#toc">Table des matières</A> générale</P> <P> <A HREF="Printing-HOWTO.html">Début</A> du document, <A HREF="#0"> Début de ce chapitre</A></P> </BODY> </HTML>