En av finesserna med lpd är att den stöder utskrift över nätverket till skrivare fysiskt anslutna till en annan maskin. Med en noggran kombination av filter scripts och tillhörande program kan du använda lpd till att på ett raktframt sätt skriva ut på skrivare anslutna till alla sorters nätverk.
För att låta andra maskiner skriva till din skrivare måste du lista
dem i /etc/hosts.equiv eller /etc/hosts.lpd.
(Observera att hosts.equiv medför andra effekter, var säker på
att du vet vad du gör innan du listar någon maskin där). Du kan
tillåta bara vissa anvndare på andra maskiner att skriva till din
skrivare genom att använda rs attributet; läs
lpd
manualsidan för information om detta.
lpd
För att skriva ut till en annan maskin skapar du en /etc/printcap post som denna:
# REMOTE djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:rm=machine.out.there.com:\
:rp=printername:\
:lp=/dev/null:\
:sh:
Observera att det fortfarande finns en spoolkatalog på den lokala
maskinen som hanteras av lpd
. Om den andra maskinen är upptagen
eller offline kommer utskriftsjobben att vänta i spoolkatalogen tills
de kan sändas.
rlpr
Du kan också använda rlpr för att skicka ett utskriftsjob direkt till en kö på en annan maskin utan att behöva gå igenom krånglet med att konfigurera lpd för att fixa det. Detta är användbart framför allt då du skriver till olika skrivare bara någon enstaka gång. Från introduktionen av rlpr:
Rlpr använder TCP/IP för att skicka utskriftsjobb till lpd servrar var som helst i ett nätverk.
Till skillnad från lpr kräver rlpr *inte* att den andra skrivaren är känd för maskinen som du vill skriva från (t.ex. genom /etc/printcap) och kan därför anses vara mer flexibel och kräver mindre administration.
rlpr kan användas överallt där traditionell lpr kan användas och är bakåtkompatibel med traditionell BSD lpr.
Den största styrkan med rlpr är förmågan att skriva ut på fjärrenheter *från var-som-helst till var-som-helst* utan att bry sig om hur det andra systemet du vill skriva ut från är konfigurerat. Kan användas som ett filter precis som traditionell lpr så att klienter som körs på en avlägsen maskin som netscape, xemacs, etc, etc kan skriva ut till din maskin med små ansträngningar.
Rlpr finns tillgängligt från
SunSite
.
Det finns en Print to Windows mini-HOWTO där ute som innehåller mer info om detta än vad som finns här.
Det är möjligt att leda en lpd kö genom
smbclient
programmet (en del av samba-sviten) till en TCP/IP baserad SMB print
service. Samba inkluderar ett script för detta som kallas
smbprint
. Kortfattat går det till så att du lägger en
konfigurationsfil för skrivaren i fråga i spool katalogen och
installerar smbprint
scriptet som if.
/etc/printcap posten ser ut så här:
lp|remote-smbprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lp:\
:if=/usr/local/sbin/smbprint:
Du skall läsa dokumentationen i smbprint
scriptet för ytterligare
information om hur du konfigurerar detta.
Du kan också använda smbclient
för att sända en fil direkt
till ett SMB printing system utan att blanda in lpd
. Se
manualsidan.
ncpfs sviten inkluderar en funktion som kallas nprint
som
tillhandahåller samma funktion som smbprint
fast for NetWare. Du
kan skaffa ncpfs från
SunSite.
Utdrag ur LSM posten för version 0.16:
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 Linux printing system. 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.
För att få nprint
att fungera via lpd måste du skriva ett litet
script som skriver stdin på NetWare skrivaren och installera detta som
if till en lpd skrivarkö. Du får något som liknar:
sub2|remote-NWprinter:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/sub2:\
:if=/var/spool/lpd/nprint-script:
nprint-scriptet
borde se ut ungefär så här:
#! /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 -
Netatalk paketet innehåller någonting som liknar nprint
och
smbclient
. Andra har dokumenterat proceduren för att skriva till
och från ett Apple nätverk mycket bättre än vad jag någonsin kommer
att göra, se
Linux Netatalk-HOWTO.
HP och några andra skrivare levereras med ett ethernet interface som du kan skriva till direkt med lpd. Du skall följa instruktionerna som följer skrivaren eller dess nätverskadapter. Generellt sett "kör" dessa skrivare lpd och har en eller flera köer till vilka du kan skriva. En HP, till exempel, borde fungera med en printcap post som:
lj-5|remote-hplj:\
:lp=/dev/null:sh:\
:sd=/var/spool/lpd/lj-5:\
:rm=printer.name.com:rp=raw:
HP Laserjet skrivare med Jet Direct interfaces har vanligtvis två stycken inbyggda lpd köer - "raw" som accepterar PCL (och möjligtvis PostScript) och "text" som accepterar ren ascii (och hanterar automatiskt trappstegseffekten). Om du har en JetDirect Plus3 tre-portsburk, heter köerna "raw1", "text2", o.s.v.
I en storskalig miljö, framför allt där inte alla skrivare stöder PostScript, kan det vara lämpligt att utse en speciell skrivarserver till vilken alla maskiner skriver och på vilken alla ghostscript jobb körs.
Detta låter också din Linuxburk att agera som en spool server till skrivaren så att dina nätverksanvändare snabbt kan avsluta sina utskriftsjobb och forsätta med annat utan att vänta på att skrivaren skall skriva ut något som någon annan har skickat.
För att åstadkomma detta, sätt upp en kö på din Linuxburk som pekar på den ethernetutrustade HP LJ (som ovan). Sen konfigurerar du alla klienter på ditt LAN att skriva till denna kö (ex. lj-5 i exemplet ovan).
Till en del HP nätverksskrivare behöver troligen inte försättsbladsinställningen skickas av klienterna, du kan stänga av deras internt genererade försättsblad genom att 'telnetta' till printern, trycka retur två gånger, skriva "banner: 0" följt av "quit". Det finns flera inställningar som du kan ändra på detta vis, skriv "?" för att se en lista.
En del skrivare (och skrivarrutiner i nätverk som "black boxes") stöder bara ett dåligt litet icke-protokoll med rena TCP anslutningar. Att märka i denna kategori är tidiga JetDirect (inkluderande en del JetDirectEx) kort. Kortfattat, för att skriva till skrivaren måste du öppna en TCP anslutning till skrivaren på en speciell port (vanligtvis 9100 eller 9100, 9101, 9102 för tre-ports) och stoppa in ditt utskriftsjobb i skrivaren. Detta kan, bland annat, implementeras med 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;
}
En underlighet men lpd är att if inte körs för fjärranslutna skrivare. Om du finner att du behöver köra ett if, så kan du göra detta genom att konfigurera en dubbel kö och köa om jobbet. Som ett exempel studera följande printcap:
lj-5:\
: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:
belyst av detta filter-lj-5
script:
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
lpr -Plj-5-remote -U$5
Argumentet -U till lpr fungerar bara om lpr körs som en daemon och sätter begärarens namn för jobbet i den andra kön på rätt sätt. Du bör använda en mer rubust metod för att få användarnamnet eftersom det i vissa fall inte är argument 5. Se manualsidan för printcap.
Att skriva från en Windows (eller förmodligen OS/2) klient till en Linuxserver är direkt stödd över SMB genom användande av SAMBA paketet, som dessutom stöder fildening av ditt Linux filsystem till Windowsklienter.
Samba inkluderar en ganska komplett dokumentation, och det finns en bra Samba FAQ som också täcker det. Du kan antingen konfigurera ett magic filter på Linuxburken och skriva PostScript till detta eller springa runt och installera skrivarspecifica drivrutiner på alla Windowmaskiner och ha en kö för dem utan något filter. Att förlita sig på Windows drivrutiner kan i en del fall leda till bättre utskrifter, men ar mer administrativt krävande om det är många Windowsmaskiner. Du bör testa PostScript först.
Netatalk stöder utskrift från Apple klienter över EtherTalk. Se Netatalk HOWTO Page för mer information.
ncpfs paketet inkluderar en daemon som heter pserver som kan användas till att serva en NetWare skrivarkö. Vad jag har förstått kräver ett sådant system "Bindery-Based NetWare" d.v.s. 2.x, 3.x eller 4,x med "bindery access" aktiverad.
För ytterligare information om ncpfs och dess pserver progam, se the ncpfs FTP site.