Page suivante - Page précédente - Table des matières

12. L'impression à distance

Une des caractéristiques de lpd 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.

12.1 Vers un hôte Unix/lpd

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 /etc/hosts.lpd, soit dans le fichier /etc/hosts.equiv. Ce sont des fichiers textes normaux, dans lesquels on indique un nom de machine par ligne.

Il est préférable de déclarer les machines dans /etc/hosts.lpd qui est spécialement réservé à l'impression, le fichier /etc/hosts.equiv donnant des droits plus étendus.

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 :rg=: du fichier printcap: rg=admin restreint l'utilisation aux utilisateurs du groupe admin. Le paramètre booléen :rs=: du même fichier restreint l'accès aux utilisateurs ayant un compte sur votre machine.

Avec lpd

Pour imprimer vers une autre machine, vous devez créer une entrée printcap telle que:

 # REMOTE djet500
 lp|dj|deskjet:\
 :sd=/var/spool/lpd/dj:\
 :rm=machine.out.there.com:\
 :rp=printername:\
 :lp=/dev/null:\
 :sh:

Vous noterez qu'il doit bien exister un répertoire de spool local géré par votre lpd local. Les fichiers soumis y seront copiés puis envoyés vers la machine distante.

Avec rlpr

Vous pouvez utiliser rlpr 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.

rlpr 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 lpr.

12.2 Imprimer vers une imprimante attachée à Windows 95, NT, LanManager ou Samba.

Il existe un mini-document (Printing to Windows HOWTO) qui décrit ceci très bien.

Il est possible de rediriger une file lpd vers un service d'impression SMB grâce au programme smbclient (http://www.picante.com/~gtaylor/pht/man/smbclient.html). Samba contient un script (smbprint) 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 smbprint en tant que filtre dans /etc/printcap:

 lp|remote-smbprinter:\
 :lp=/dev/null:sh:\
 :sd=/var/spool/lpd/lp:\
 :if=/usr/local/sbin/smbprint:

Vous pouvez également utiliser le programme smbclient pour soumettre un fichier directement à un service d'impression SMB sans impliquer lpd. Lisez la documentation de tous ces programmes pour plus d'information.

12.3 Vers une imprimante NetWare

La suite logicielle ncpfs contient un utilitaire appelé nprint qui fournit les mêmes fonctionnalités que smbprint pour NetWare. Vous pouvez l'obtenir sur ftp://sunsite.unc.edu/pub/Linux/system/filesystems/ncpfs/. Avec ncpfs 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. ncpfs NE fonctionne PAS avec un noyau 1.3.x (x < 54).

Pour que nprint fonctionne via lpd, vous devez écrire un shell-script pour diriger stdin sur l'imprimante NetWare. Vous l'installerez comme un filtre (if) d'une file d'impression lpd. Vous obtiendrez :

sub2|remote-NWprinter:\
 :lp=/dev/null:sh:\
 :sd=/var/spool/lpd/sub2:\
 :if=/var/spool/lpd/nprint-script:

le script nprint-script ressemble à quelque chose comme :

 #! /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 -

12.4 Vers une imprimante EtherTalk

Le paquetage logiciel netatalk contient l'équivalent de nprint et smbclient. Référez-vous au Netatalk-HOWTO dans lequel est bien décrite la procédure d'impression vers et depuis un réseau Apple.

12.5 Vers une imprimante HP ou autre imprimante Ethernet

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 lpd et fournissent une ou plusieurs files vers lesquelles vous pouvez imprimer. Une imprimante HP, par exemple, pourra fonctionner avec une entrée printcap telle que:

lj-5|remote-hplj:\
 :lp=/dev/null:sh:\
 :sd=/var/spool/lpd/lj-5:\
 :rm=printer.name.com:rp=raw:

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).

Dans un environnement dans lequel plusieurs imprimantes ne supportent pas le PostScript, 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.

12.6 Vers d'anciennes HP

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 :

 #!/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&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;
 }

12.7 Les filtres d'entrée pour des imprimantes distantes

Une des bizarreries de lpd est que le filtre d'entrée (if) 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 :

 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:

et le filtre filter-lj-5 (exemple):

 #!/bin/sh
 gs <options> -q -dSAFER -sOutputFile=- - | \
 lpr -Plj-5-remote -U$5

L'option -U ne fonctionne que si lpr 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.

12.8 Imprimer depuis Windows

L'impression depuis un client Windows vers un serveur Unix est directement supporté par SMB en utilisant le paquetage SAMBA (qui supporte également le partage de fichiers du système de fichiers Linux vers les clients Windows).

Samba est fourni avec une documentation complète. Vous pouvez soit installer un filtre magique sur Linux et imprimer du PostScript 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.

12.9 Depuis Netware

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.

12.10 Depuis un Apple

Netatalk permet d'imprimer depuis une station Apple sur EtherTalk. Voir le Netatalk HOWTO (http://thehamptons.com/anders/netatalk) pour de plus amples renseignements.

12.11 Imprimer vers un fax

Utiliser un modem/fax

Si vous disposez d'un modem/fax, vous pouvez configurer votre système pour envoyer ou recevoir des fax aux formats PostScript, dvi, ascii, etc... Vous pourrez même faire en sorte que votre courrier électronique soit faxé!

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!)

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.

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 Ghostscript sait faire ! Le pilote tiffg3 génère des messages fax encodés au format g3/tiff. Vous devrez compiler et intégrer le pilote si ce n'est déjà fait.

Un des logiciels les plus complets sur le sujet, HylaFax est disponible sur :

 ftp.sgi.com:/sgi/fax/?????.src.tar.Z

Il supporte toutes sortes de choses comme les multiples modems et la diffusion.

mgetty + sendfax est un couple de logiciels, contenant un getty pour Linux et les modems fax ainsi qu'un logiciel d'envoi de fax assez simple. Ce paquetage se trouve à:

 sunsite.unc.edu:/pub/Linux/system/serial/getty/mgetty+sendfax-1.0.0.tar.gz

Enfin, efax mérite d'être mentionné. C'est un excellent choix pour Linux. Il supporte les classes 1 et 2.

 sunsite.unc.edu:/pub/Linux/apps/serialcomm/fax/efax08a.tar.gz

(Répertoire dans lequel on trouvera également vfax10.tar.z, qfax1.3.tar.gz, xfax.v1.07s.tar.gz)

Utiliser le service d'impression distant

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'' (http://www.tpc.int/).


Page suivante - Page précédente - Table des matières