Verder Terug Inhoud

11. Hoe afdrukken naar een printer over het netwerk

Één van de mogelijkheden van lpd is dat het afdrukken over het netwerk naar printers ondersteunt, die fysiek met een andere machine zijn verbonden. Je kunt er voor zorgen dat lpr transparant naar printers op alle soorten netwerken af kan drukken, als je zorgt voor een zorgvuldige combinatie van filterscripts en bij elkaar passende utility's.

11.1 Naar een Unix/lpd host

Om remote computers toe te staan naar je printer af te drukken, moet je de lijst met computers in /etc/hosts.equiv of /etc/hosts.lpd bijwerken. (Merk op dat hosts.equiv nog heel wat andere effecten heeft; wees er zeker van dat je weet wat je aan het doen bent als je je computer hier i vermeldt). Je kunt alleen bepaalde gebruikers op de andere computers toestaan om naar je printer af te drukken door het specificeren van de rs attribuut; lees de lpd man page voor informatie hierover.

Met lpd

Om naar een andere machine af te drukken, voeg je als volgt gegevens toe aan /etc/printcap:

# REMOTE djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=machine.out.there.com:\
        :rp=printername:\
        :lp=/dev/null:\
        :sh:
Noot: Er bevindt zich op de lokale computer nog steeds een spooldirectory die door lpd wordt beheerd. Als de remote machine bezet of offline is, kunnen afdruktaken van de lokale computer in het spoolgebied wachten tot ze kunnen worden verzonden.

Met rlpr

Je kunt rlpr ook gebruiken een afdruktaak direct naar een wachtrij op een remote computer te sturen. Dit is vooral handig in situaties waar je slechts bij gelegenheid naar een diversiteit aan printers afdrukt. Vanuit de aankondiging voor rlpr:

Rlpr gebruikt TCP/IP om taken naar lpd-servers, waar dan ook op een netwerk, af te drukken.

In tegenstelling tot lpr, vereist het *niet* dat de remote printers expliciet bekend zijn bij de machine vanwaar je af wilt drukken, (d.w.z. door /etc/printcap) en is dus aanmerkelijk flexibeler en vereist minder beheer.

rlpr kan overal worden gebruikt waar ook een traditionele lpr zou kunnen worden gebruikt, en het is backwards compatibel met de traditionele BSD lpr.

De belangrijkste kracht die door rlpr wordt bereikt is de kracht om op afstand *van overal naar iedere plaats* af te drukken zonder rekening te houden met hoe het systeem vanwaar je wilt afdrukken werd geconfigureerd. Rlpr kan net als de traditionele lpr als een filter werken, zodat clients die op een remote computer worden uitgevoerd, zoals netscape, xemacs, enz., enz., zonder al te veel moeite naar je lokale computer af kunnen drukken.

Rlpr is beschikbaar vanaf Metalab.

11.2 Naar een Win95, WinNT, LanManager, of Samba printer

Er is een Printing naar Windows mini-HOWTO waarin meer informatie staat dan hierin is te vinden.

Het is mogelijk een lpd wachtrij te besturen via de smbclient programma (onderdeel van de samba suite) naar een op TCP/IP gebaseerde SMB print service. Samba bevat hiervoor een script met de naam smbprint. In het kort komt het erop neer dat je een configuratiebestand voor de specifieke printer waar het om gaat in de spooldirectory plaatst, en het smbprint-script als de if installeert.

Het /etc/printcap record ziet er ongeveer zo uit:

lp|remote-smbprinter:\
    :lp=/dev/null:sh:\
    :sd=/var/spool/lpd/lp:\
    :if=/usr/local/sbin/smbprint:

Je zou de documentatie in het smbprint script moeten lezen, voor meer informatie over hoe je dit in kunt stellen.

Je kunt ook de smbclient gebruiken, om een bestand direct aan een SMB afdrukservice aan te leveren zonder dat lpd daarbij betrokken is. Zie de man page.

11.3 Naar een NetWare Printer

In de ncpfs suite bevindt zich een utility genaamd nprint welke in dezelfde functionaliteit voorziet als smbprint maar dan voor NetWare. Je kunt ncpfs verkrijgen bij Metalab. Vanuit het LSM record voor versie 0.16:

Met ncpfs kun je volumes van je netwareserver onder Linux mounten. Je kunt ook naar een netware afdrukwachtrij afdrukken en spool netware afdrukwachtrijen naar het Linux afdruk systeem. Je hebt kernel 1.2.x of 1.3.54 en hoger nodig. ncpfs werkt NIET met enige 1.3.x kernels lager dan 1.3.54.

Om ervoor te zorgen dat nprint via lpd werkt, schrijf je een klein shell-script om stdin op de NetWare printer af te drukken, en dat installeer je als de if voor een lpd afdrukwachtrij. Je zult iets krijgen als:

sub2|remote-NWprinter:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/sub2:\
        :if=/var/spool/lpd/nprint-script:
Bij benadering kan het nprint-script er ongeveer zo uitzien:
#! /bin/sh
# Je zou eerst de guest account zonder wachtwoord moeten proberen!
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -

11.4 Naar een EtherTalk (Apple) printer

Het netatalk package bevat iets degelijks als nprint en smbclient. Anderen hebben de procedure voor het afdrukken van en naar een Apple netwerk veel beter beschreven dan ik dat ooit zal kunnen; zie de Linux Netatalk-HOWTO.

11.5 Naar een HP of andere ethernet printer

HP's en een aantal andere printers worden met een ethernet interface geleverd waarnaar je met gebruik van lpd direct af kunt drukken. Je zou de instructies die met je printer werden meegeleverd of de netwerk adaptor moeten lezen, maar in het algemeen, "draaien" dergelijke printers lpd, en voorzien in één of meer wachtrijen waarnaar je kunt afdrukken. Een HP zou bijvoorbeeld met een volgend printcap kunnen werken:

lj-5|remote-hplj:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/lj-5:\
        :rm=printer.name.com:rp=raw:

HP Laserjet printers met Jet Direct interfaces ondersteunen in het algemeen twee ingebouwde lpd wachtrijen - "raw" welke PCL accepteren (en mogelijk Postscript) en "text" welke recht toe recht aan ascii accepteert (en automatisch het staircase effect bestrijdt). Als je een JetDirect Plus3 three-port box hebt, worden de wachtrijen "raw1", "text2", enzovoort genoemd.

Merk op dat de ISS-organisatie een verzameling denial of service attacks heeft herkend waardoor HP Jetdirect interfaces vastlopen. De meeste daarvan zijn in de herfst van 98 aangepakt.

Op grote schaal, vooral in een grote omgeving waar een aantal printers geen Postscript ondersteunen, kan het nuttig zijn een toegewezen printserver in te stellen waarnaar alle computers afdrukken en waarop alle ghostscripts taken worden gedraaid.

Hierdoor is het ook mogelijk dat je Linux-box als een spoolserver voor de printer fungeert zodat je netwerkgebruikers hun afdruktaken snel kunnen volbrengen en verder kunnen gaan zonder op de printer te wachten totdat enige andere taak is afgedrukt welke door een ander was gezonden. Dit is ook aan te bevelen als je oudere niet te herstellen HP Jetdirects hebt; het vermindert de kans dat de printers vast komen te zitten.

Stel hiervoor een wachtrij in op je linux-box welke naar de ethernet toegeruste HP LJ verwijst (zoals hierboven). Stel nu alle clients op je LAN zo in dat ze naar de Linux wachtrij verwijzen (bv lj-5 in het voorbeeld hierboven).

Een aantal HP netwerk-printers slaan blijkbaar geen acht op de banner page instelling die door clients wordt gezonden; je kunt hun intern gegenereerde banner page uitschakelen door naar de printer te telnetten, tweemaal een return te geven, in te tikken "banner: 0" gevolgd door "quit". Er zijn bovendien nog andere instellingen die je op deze manier kunt wijzigen; tik een "?" in voor een lijst.

De volledige range aan instellingen kan worden beheerd door HP's WebJet software. Dit package draait als een daemon, en accepteert via een toegewezen poort http-verzoeken. Het voorziet in formulieren en Java-applets waarmee de HP-printers op het netwerk kunnen worden bestuurd. In theorie kan het ook Unix afdrukwachtrijen beheren, maar het doet dit door gebruik te maken van de rexec service, welke volledig onveilig is. Ik adviseer je die mogelijkheid niet te gebruiken.

Naar oudere HP's

Een aantal printers (en printer netwerk "black boxen") ondersteunen alleen goedkope kleine zonder protocol ingesloten TCP-verbindingen. In deze categorie bevinden zich de vroege modellen van de JetDirect (waaronder een aantal JetDirectEx) kaarten. Eigenlijk moet je een verbinding met de printer op een specifieke poort openen om naar de printer af te drukken (typisch een 9100, of 9100, 9101 en 9102 voor three-port boxes) en je afdruktaak ernaar toe sturen. LPRng (wat je eigenlijk daarvoor in de plaats zou moeten gebruiken, als je deze sectie leest) heeft ingebouwde ondersteuning voor het opzetten van afdruktaken naar willekeurige TCP-poorten, maar met BSD lpd is het niet zo gemakkelijk. Het beste is waarschijnlijk het kleine utility genaamd netcat te verkrijgen en te gebruiken. Als dat niet lukt, kan het onder andere in Perl worden geïmplementeerd:

#!/usr/bin/perl
# Met dank aan Dan McLaughlin voor het schrijven van de originele versie van
# dit script (En aan Jim W. Jones voor het naast Dan zitten toen hij me
# schreef voor hulp ;-)

$fileName = @ARGV[0];

open(IN,"$fileName") || die "Kan het bestand $fileName niet openen";

$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 $!;
}
# Geef de socket een adres.
if (bind(S, $this)) {
#    print "bind ok\n";
}
else {
    die $!;
}

# Roep de server aan.

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;
}

11.6 Een if voor remote printers uitvoeren

Één eigenaardigheid van lpd is dat de if niet voor remote printers wordt uitgevoerd. Als je bemerkt dat je een if nodig hebt, kun je dit doen door een dubbele wachtrij in te stellen en de taak opnieuw in de wachtrij te plaatsen. Zie de volgende printcap voor een voorbeeld:

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:
rekening houdend met dit filter-lj-5 script:
#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
        lpr -Plj-5-remote -U$5

De -U optie van lpr werkt alleen als lpr als een daemon wordt uitgevoerd, en het stelt de naam juist in van degene die de afdrukopdracht gaf. Je zou waarschijnlijk een meer robuuste methode moeten gebruiken om de gebruikersnaam te verkrijgen, aangezien het in een aantal gevallen niet argument 5 is. Zie de man page van printcap.

11.7 Vanaf Windows

Afdrukken vanaf een Windows (of waarschijnlijk, OS/2) client naar een Linux server wordt direct ondersteund via SMB door middel van het gebruik van het SAMBA package, waarmee ook het delen van bestanden van je Linux bestandssysteem naar Windows clients wordt ondersteunt.

Samba bevat tamelijk complete documentatie, en er is tevens een goede Samba FAQ die daarop van toepassing is. Je kunt zowel een magic filter op de Linux-box configureren en er PostScript naar afdrukken, als printer-specifieke drivers op alle Windows-computers installeren en daar wachtrijen voor instellen zonder dat daar filters voor nodig zijn. Op de Windows drivers vertrouwen kan in een aantal gevallen betere uitvoer produceren, maar is wat meer administratief gedoe als er veel Windows boxen zijn. Dus probeer eerst Postscript.

11.8 Vanaf een Apple

Netatalk ondersteunt het afdrukken vanaf Apple clients over EtherTalk. Zie de Netatalk HOWTO Page voor meer informatie.

11.9 Vanaf Netware

Het ncpfs package bevat een daemon genaamd pserver welke kan worden gebruikt om in een service te voorzien naar een NetWare afdrukwachtrij. Van wat ik ervan heb begrepen, vereist dit systeem een op Bindery gebaseerde NetWare, bv 2.x, 3.x, of 4.x met bindery toegang geactiveerd.

Zie de ncpfs FTP site voor meer informatie over ncpfs en zijn pserver-programma.


Verder Terug Inhoud