Den minimala konfigureringen för lpd resulterar i ett system som kan köa filer och skriva ut dem. Det tar ingen hänsyn till om skrivaren förstår dem eller inte, och kommer förmodligen inte att leda till attraktiva utskrifter. Men det är ett första steg mot att förstå hur det funkar, så läs vidare!
För att lägga en skrivarkö till lpd måste du lägga till en post (entry) i /etc/printcap, och skapa en ny katalog för skrivarkön (spool directory) under /var/spool/lpd.
En post i /etc/printcap ser ut så här:
# LOCAL djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
Detta definierar en skrivarkö som kallas lp, dj, eller
deskjet, köade (spoolade) i katalogen /var/spool/lpd/dj,
utan begränsning på utskriftsjobbens storlek om skriver till enheten
/dev/lp0 och som inte lägger ett försättsblad (med namnet på
den person som skriver ut, m.m.) till utskriften.
Läs nu manualsidan (man-page) för printcap.
Ovanstående ser väldigt enkelt ut, men det finns en hake - såvida inte jag sänder filer som som en desjet 500 förstår kommer denna deskjet att skriva konstiga saker. Till exempel om vi skickar en vanlig Unix text fil till en deskjet får vi en utskrift enligt följande:
This is line one.
This is line two.
This is line three.
osv. En PostScript fil som skrivs till denna kö resulterar i en
vacker listning av PostScript kommandon, utskrivna med denna
trappstegseffekt (staircase effect), men ingen användbar utskrift.
Tydligen behövs något mer, och detta är syftet med filtrering (filtering). De mer observanta av er som läste manualsidan till printcap kanske uppmärksammade spool-attributen if och of. Just if, eller 'input-filter' är precis vad vi behöver här.
Om vi skriver ett litet script som lägger till vagnretur före radbyten och kallar det filter kan trappstegseffekten elemineras. Vi måste också lägga in en if rad i vår printcap-post här ovan:
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
Ett enkelt filterscript skulle kunna vara:
#!perl
# Raden ovan skall ha hela sökvägen till perl
# Scriptet måste vara körbart: chmod 755 filter
while(<STDIN>){chop $_; print "$_\r\n";};
# Eventuellt behöver du avsluta med att mata ut papperet: print "\f";
Om vi gjorde som ovan skulle vi få en skrivarkö till vilken vi kunde
skriva ut vanliga Unix textfiler och få ett meningsfullt
resultat. (Ja, det finns fyra miljoner bättre sätt att skriva detta
filter men få som är så illustrativa. Du uppmuntras att göra detta mer
effektivt.)
Det enda kvarvarande problemet är det att det inte är alltför 'hett' att skriva ut vanlig text - visst skulle det vara bättre att kunna skriva ut PostScript och annan formaterad eller grafisk typ av utskrift. Jo det är klart att det vore bättre, och det är inte svårt att fixa till. Metoden är helt enkelt ett tillägg till ovanstående radmatnings-fixar filter. Om du kan skriva ett filter som kan acceptera godtyckliga filformat som input och producera DeskJet-kosher output för var och en av dessa har du verkligen ett smart utskrifts system.
Ett sådant filter kallas ett magic filter. Bry dig inte om att skriva ett sådant själv såvida du inte skriver mycket underliga saker - Det finns många redan skrivna åt dig på nätet. APS Filter är bland de bästa, eller din Linuxdistribution kan ha ett skrivarkonfigureringsprogram som gör detta väldigt enkelt.
På allmän begäran lägger jag in en lista på filrättigheterna på intressanta filer i mitt system. Det finns flera bättre sätt att lösa detta, idealiskt genom att använda bara SGID binärfiler och inte göra allt SUID root, men så här var mitt system från början och det funkar bra för mig. (Uppriktigt sagt, om din leverantör inte ens kan leverera ett fungerande lpd så är du ute på djupt vatten).
-r-sr-sr-x 1 root lp /usr/bin/lpr*
-r-sr-sr-x 1 root lp /usr/bin/lprm*
-rwxr--r-- 1 root root /usr/sbin/lpd*
-r-xr-sr-x 1 root lp /usr/sbin/lpc*
drwxrwxr-x 4 root lp /var/spool/lpd/
drwxr-xr-x 2 root lp /var/spool/lpd/lp/
Lpd måste för närvarande köras som root så att den kan ansluta till `low-numbered lp service port'. Den borde bli UID lp.lp eller något sådant efter anslutning, men jag tror inte att den blir det. Det är inte bra.