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.
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.
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.
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
.
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.
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 -
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.
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.
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;
}
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.
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.
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.
Netatalk permet d'imprimer depuis une station Apple sur EtherTalk. Voir le
Netatalk HOWTO
(http://thehamptons.com/anders/netatalk
)
pour de plus amples renseignements.
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
)
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/
).