Una delle capacita' di lpd e' che supporta la stampa attraverso la rete su stampanti fisicamente connesse ad altre macchine. Con una attenta combinazione di filtri e utility assortite, si puo' far stampare lpd su stampanti connesse a qualsiasi tipo di rete, in modo del tutto trasparente.
Per abilitare una macchina remota a stampare sulla vostra stampante, dovete
elencare tale macchina in /etc/hosts.equiv o /etc/hosts.lpd
(notate che
mettere una macchina in hosts.equiv ha molti altri effetti; assicuratevi di
sapere cosa state facendo prima di mettere una macchina qui). Potete anche
abilitare solo certi utenti della macchina remota a stampare sulla vostra
stampante utilizzando l'attributo rs; leggete la man page di
lpd
per
informazioni.
Per stampare su un'altra macchina, dovete aggiungere ad /etc/printcap una voce di questo tipo:
# REMOTE djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:lp=/dev/null:\
:sh:
Notate che c'e' ancora la coda di stampa sulla macchina locale, gestita da lpd, in modo che se la macchina remota e' occupata o offline, i lavori di stampa possono essere accodati nell'area di spool fino a che possono essere inviati.
Si puo' anche usare rplr per mandare un lavoro di stampa direttamente in una coda su una macchina remota, senza doversi preoccupare di configurare lpd per supportare la stampa remota. Cio' e' piu' utile quando stampate su un gran numero di stampanti solo occasionalmente. Dall'annuncio di rlpr:
Rlpr usa il TCP/IP per mandare lavori di stampa a server lpd ovunque su una rete.
Diversamente da lpr, non necessita che la stampante remota sia esplicitamente conosciuta alla macchina da cui si vuole stampare (ad esempio tramite /etc/printcap) e pertanto e' molto piu' flessibile e richiede meno amministrazione.
Rlpr puo' essere usato ovunque si puo' usare un normale lpr, ed ' compatibile all'indietro con l'lpr BSD.
Il maggior vantaggio che si ottiene con rlpr e' la capacita' di stampare remotamente da qualsiasi macchina a qualsiasi macchina, senza preoccuparsi per come e' configurato il sistema su cui si desidera stampare. Inoltre puo' lavorare come un filtro, in modo che applicazioni cliente in esecuzione su una macchina remota, come Netscape, xemacs, etc, possono stampare sulla macchina locale senza sforzo.
Rlpr e' disponibile presso
SunSite
.
E' possibile dirigere una coda di stampa di lpd, attraverso il programma
smbclient
(della suite samba), ad un servizio di stampa SMB basato su TCP/IP.
Samba comprende uno script chiamato smbprint per fare questo. In breve,
inserite un file di configurazione per la stampante in questione nella directory
di spool, e installate smbprint come if.
In /etc/printcap ci sara' qualcosa del genere:
lp|remote-smbprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:
Dovete leggere la documentazione all'interno dello script smbprint
per
ulteriori informazioni su come configurarlo.
E' anche possibile usare smbclient
per passare un file direttamente al servizio
di stampa SMB senza coinvolgere lpd
. Controllate la man page.
La suite ncpfs comprende una utility chiamata nprint
che fornisce le stesse
funzionalita' di smbprint
, ma per NetWare. Potete ottenere ncpfs da
ftp://linux01.gwdg.de/pub/ncpfs/. Dalla LSM per ncpfs versione 0.16:
Con ncpfs potete montare volumi del vostro server NetWare sotto Linux. Inoltre potete stampare verso code di stampa NetWare e fare lo spool di code di stampa NetWare verso sistemi Linux. Avete bisogno del kernel 1.2.x, o 1.3.54 o superiori. ncpfs non funziona con kernel della serie 1.3.x inferiori alla 1.3.54.
Per far funzionare nprint
attraverso lpd, serve un piccolo script della shell
che stampa lo stdin sulla stampante NetWare, e che va installato come if per
una coda di stampa di lpd. Dovreste avere qualcosa del tipo
sub2|remote-NWprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:
mentre lo script per nprint sara' qualcosa del genere
#! /bin/sh
|/usr/local/bin/nprint -S net -U name -P passwd -q printq-q -
Il package netatalk comprende qualcosa sul genere di nprint
e
smbclient
. Werner
Eugster ha documentato la procedura per stampare da e verso una rete Apple
molto meglio di quanto io potrei mai fare; date un'occhiata alla sua
web page.
Problema misterioso della settimana: Netatalk non funziona con una scheda SMP Etherpower PCI dotata di chip DEC tulip.
Le HP ed alcune altre stampanti sono dotate di un'interfaccia ethernet verso la quale si puo' stampare direttamente usando lpd. Dovete seguire le istruzioni allegate alla stampante, o all'interfaccia di rete, ma in generale tali stampanti "eseguono" lpd, e forniscono una o piu' code su cui stampare. Una HP, per esempio, dovrebbe funzionare con un printcap del tipo
lj-5|remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:rp=raw:
In una installazione su larga scala, specialmente in un ambito in cui alcune stampanti non supportano il PostScript, puo' essere conveniente configurare un server di stampa dedicato, verso il quale stampano tutte le macchine, e che esegue le varie istanze di ghostscript.
Alcune stampanti (e stampanti messe in rete come "scatole nere") supportano solo una specie di non-protocollo basato su connessioni TCP. In questa categoria rientrano le prime schede JetDirect (comprese alcune JetDirecEx). Fondamentalmente, per stampare su stampanti di questo tipo, si deve aprire una connessione TCP su una porta specifica (di solito 9100) e trasmetterci il documento da stampare. Cio' puo' essere fatto, tra gli altri modi, in Perl:
#!/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;
}
Un difetto di lpd e' che l'if non e' eseguito per le stampanti remote. Se avete bisogno di eseguire un if, potete farlo configurando una coda di stampa doppia, e riaccodando il lavoro di stampa. Come esempio prendiamo questo printcap:
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:
alla luce di questo script di filtraggio filter-lj-5:
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5
L'opzione -U di lpr funziona solamente se lpr e' esguito come demone, e pone il nome d'utente corretto nella seconda coda di stampa. Probabilmente e' meglio usare un metodo piu' robusto per determinare il nome dell'utente, perche' in alcuni casi non e' il quinto argomento. Verificate la man page di printcap.