Najmanjša sestava lpd-ja naredi sistem, ki sprejema datoteke v čakalno vrsto in jih natisne. Ne ozira se na to, ali jih vaš tiskalnik sploh razume, in vam verjetno ne bo dovoljeval izdelavo privlačnega izhoda. Vseeno je to prvi korak k razumevanju, zato berite naprej!
Če želite dodati tiskalniško čakalno vrsto v lpd, morate dodati vnos v datoteko /etc/printcap, in narediti nov čakalni imenik pod /var/spool/lpd.
Vnos v /etc/printcap izgleda podobno:
# LOKALNI djet500
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:sh:
To definira čakalno vrsto, imenovano lp, dj, ali
deskjet, ki čaka v imeniku /var/spool/lpd/dj, z nobenih
omejitev velikosti za posamezno opravilo, ki tiska na napravo
/dev/lp0, in, ki nima naslovne strani (z imenom osebe, ki
tiska, ipd.) dodane v ospredje tiskalniškega opravila.
Zdaj z ukazom man printcap
preberite stran v referenčnem
priročniku za
printcap
Vse zgornje izgleda zelo preprosto, a tukaj je skrit kavelj -- če ne pošiljate datotek, ki jih DeskJet 500 lahko razume, bo ta DeskJet tiskal čudne stvari. Na primer, če pošljete povsem običajno tekstovno datoteko Unixa na tiskalnik deskjet, bo ta dobesedno razumel znake za novo vrstico, in dobili bomo:
To je prva vrstica.
To je druga vrstica.
To je tretja vrstica.
in tako naprej. Tiskanje postscriptne datoteke v to čakalno vrsto nam
bo dalo čudovit izpis ukazov PostScripta, izpisanih s tem
,,stopničastim efektom``, a nobenega uporabnega izhoda.
Gotovo je potrebno več dela, in to je namen filtriranja. Tisti med vami, ki dobro opažate in ste prebrali referenčno stran o printcap, ste morda opazili atribute čakalne vrste (angl. spool attributes) if in of. No, if, ali vhodni filter, je natanko to, kar tukaj potrebujemo.
Če napišemo majhen ukazni skript imenovan filter, ki doda znake za pomik na začetek vrste (angl. carriage return, CR) pred znake za konec vrstice, bomo s tem odpravilo stopničavost besedila. Torej moramo v naš vnos v printcap dodati vrstico z if:
lp|dj|deskjet:\
:sd=/var/spool/lpd/dj:\
:mx#0:\
:lp=/dev/lp0:\
:if=/var/spool/lpd/dj/filter:\
:sh:
Preprost filtrirni skript filter
bi lahko bil:
#!perl
# Zgornja vrstica mora v resnici vsebovati polno pot do
# tolmača perl.
# Ta skript mora biti izvedljiv: chmod 755 filter
while(<STDIN>){chop $_; print "$_\r\n";};
# Morda boste želeli končati z znakom za izmet strani:
# print "\f";
Če naredimo zgornje, smo dobili čakalno vrsto, ki zna tiskati datoteke
z običajnimi besedili v Unixu in dobi smiselne rezultate. (Da,
obstaja štiri milijone boljših načinov, da napišemo ta filter, a le
malo jih je nazornejših. Naredite to bolj učinkovito.)
Edina preostala težava je, da tiskanje navadnega teksta pravzaprav ni preveč moderno -- gotovo bi bilo bolje, če bi lahko tiskali PostScript in druge urejene ali grafične tipe izhodov. No, da, bilo bi, in to je preprosto storiti. Metoda je preprosta razširitev zgornjega filtra za popravo vrstic. Če napišete filter, ki lahko sprejme poljuben tip datoteke kot vhod in v vsakem primeru naredi izhod čistokrvnega DeskJeta, potem imate zares bister tiskalniški strežnik!
Tak filter se imenuje filter magic. Ne utrujajte se s pisanjem tega, razen, če morate tiskati res čudne zadeve -- na mreži obstaja veliko že napisanih. APS Filter je med najboljšimi, morda pa ima že vaša distribucija Linuxa orodje za nastavitev tiskalniških reči, ki vam vse to olajša.
Zaradi ljudske zahteve vključujem spodaj izpis dovoljenj zanimivih
datotek mojega sistema. Obstaja veliko boljših načinov, da to
storite, idealno z uporabo binarnih datotek SGID in ne tako, da vse
napravite SUID root, a takšen sistem sem dobil ob nakupu in zame
deluje. (Povsem odkrito, če vam vaš prodajalec ne more prodati niti
delujočega strežnika lpd
, ste v godlji.)
-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 se mora trenutno poganjati kot root, da se lahko povezuje z nizko-oštevilčenimi vrati opravila lp. Verjetno mora po povezovanju postati UID lp.lp ali nekaj takega, a mislim da, lenuh, ne postane.