Inhalt

11. Drucker in einem Netzwerk

Eine der Fähigkeiten von lpd ist es, daß man über ein Netzwerk auf Druckern drucken kann, die physikalisch an einen anderen Rechner angeschlossen sind. Mit einer sorgfältigen Kombination von Filterskripten und anderen Utilities kann man mit lpr transparent auf allen möglichen Druckern über alle möglichen Netzwerke drucken.

11.1 UNIX/lpd Server

Um es anderen Rechnern zu ermöglichen, auf dem eigenen Drucker zu drucken, müssen diese Rechner in /etc/hosts.equiv oder /etc/hosts.ldp aufgelistet werden. Hierbei sollte man beachten, daß hosts.equiv viele weitere Effekte hat; man sollte sich sicher sein, was man tut, wenn man hier einen Rechner auflistet. Man kann auch nur bestimmten Benutzern des anderen Rechners erlauben, auf dem eigenen Drucker zu drucken, indem man das rs-Attribut benutzt; siehe dazu auch die lpd Manual Page für mehr Informationen.

Client

Um auf einem anderen Rechner zu drucken, erstelle man einen /etc/printcap-Eintrag wie diesen:

# DeskJet 500 als Netzwerkdrucker
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=geraet.da.draussen.de:\
        :rp=druckername:\
        :lp=/dev/null:\
        :sh:

Hierbei gibt rm die Internetadresse des Rechners, an dem der Drucker angeschlossen ist, und rp die Warteschlange an. Beachten Sie, daß es weiterhin ein Spool-Verzeichnis auf dem lokalen Rechner gibt, das von lpd verwaltet wird. Wenn der Netzwerkrechner beschäftigt oder nicht erreichbar ist, bleiben Druckaufträge des lokalen Rechners im Spoolverzeichnis, bis sie gesendet werden können.

rlpr

Man kann auch rlpr benutzen, um einen Druckauftrag direkt in eine Warteschlange auf einem Netzwerkrechner zu schicken, ohne sich die Mühe zu machen, den lokalen lpd entsprechend einzurichten. Das ist besonders sinnvoll, wenn man nur selten auf verschiedenen Druckern druckt. Aus der Beschreibung von rlpr:

rlpr verwendet TCP/IP, um Druckaufträge an lpd-Server in einem Netzwerk zu schicken.

Anders als bei lpr müssen die Netzwerkdrucker dem lokalen Rechner nicht bekannt sein (z.B. durch /etc/printcap). Deshalb ist rlpr wesentlich flexibler und benötigt weniger Verwaltung.

rlpr kann überall da verwendet werden, wo ein traditionelles lpr verwendet werden kann und ist abwärts-kompatibel zum traditionellen BSD lpr.

Der Hauptvorteil von rlpr ist die Möglichkeit, von überall nach überall zu drucken, ohne Rücksicht darauf, wie das System, von dem aus man drucken will, konfiguriert ist. rlpr kann genau wie das traditionelle lpr als Filter arbeiten, so daß Clients, die auf einem Netzwerkrechner laufen (z.B. Netscape, XEmacs, etc.) ohne größere Probleme auf Ihrem lokalen Rechner drucken können.

rlpr ist erhältlich von:

sunsite.unc.edu:/pub/Linux/system/Printing/

11.2 Win95, WinNT, LanManager oder Samba Server

Es ist möglich, mit dem smbclient-Programm (Bestandteil des Samba-Pakets) eine lpd-Warteschlange für einen TCP/IP-basierenden SMB-Druckservice einzurichten. Samba beinhaltet hierfür ein Script namens smbprint. Kurz gesagt legt man eine Konfigurationsdatei für den gewünschten Drucker im Spoolverzeichnis an und installiert das smbprint-Script als if.

Der /etc/printcap-Eintrag sieht wie folgt aus:

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

Sie sollten die Dokumentation im smbprint-Skript lesen, um weitere Informationen zu erhalten.

Man kann auch smbclient verwenden, um eine Datei direkt an einen SMB-Druckservice zu schicken, ohne lpd zu benutzen. Wie dieses funktioniert, ist in der Manual Page nachzulesen.

11.3 Netware Server

Im ncpfs-Paket ist ein Programm namens nprint enthalten, das die gleichen Funktionen wie smbprint für NetWare bietet. ncpfs ist erhältlich bei:

sunsite.unc.edu:/pub/Linux/system/filesystems/ncpfs/
Auszug dem LSM-Eintrag von Version 0.16:

Mit ncpfs kann man Laufwerke auf dem Netzwerk-Server unter Linux mounten. Man kann auch über Netware-Warteschlangen drucken und Netware-Warteschlangen im Linux Drucksystem spoolen. Es wird ein Kernel 1.2.x oder 1.3.54 oder höher benötigt. ncpfs funktioniert nicht mit 1.3.x-Kernels unter 1.3.54.

Damit nprint über lpd arbeitet, schreibt man ein kleines Shellscript, das als if für die entsprechende lpd-Warteschlange aufgerufen wird. Dieses Script gibt die Druckdaten, die es vom dem lpd erhält, dann auf dem Netware-Drucker aus.

sub2|remote-NWprinter:\
        :lp=/dev/null:sh:\
        :sd=/var/spool/lpd/sub2:\
        :if=/var/spool/lpd/nprint-script:

Das nprint-script könnte ungefähr so aussehen:

#! /bin/sh
# Als erstes sollten Sie den guest Account mit keinem 
# Paßwort ausprobieren!

/usr/local/bin/nprint -S net -U name -P passwd \
                      -q printq-name -

11.4 Apple Server

Im netatalk-Paket ist etwas Ähnliches wie nprint und smbclient enthalten. Andere Leute haben die Vorgehensweise beim Drucken über und von einem Apple-Netzwerk aus wesentlich besser beschrieben, als ich es jemals werde; bitte schauen Sie sich hierfür das Linux Netatalk HOWTO auf http://thehamptons.com/anders/netatalk/ an.

11.5 Drucker mit Ethernetanschluß

Drucker für den professionellen Einsatz verfügen häufig über ein Ethernet-Interface. Die meisten dieser Geräte unterstützen direkt das lp-Protokoll, so daß man sie einfach per lpd und der rp-Option ansprechen. Man sollte den Anweisungen folgen, die mit dem Drucker oder dem Netzwerkadapter des Druckers geliefert wurden. Ein Drucker von HP könnte z.B. mit einem solchem printcap-Eintrag arbeiten:

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

HP LaserJet Drucker mit JetDirect Interface stellen im allgemeinen zwei eingebaute Queues zur Verfügung:

raw

Akzeptiert Druckdaten in PCL und eventuell PostScript.

text

Kann zum Druck von reinen ASCII-Dateien verwendet werden, wobei der beschriebene Treppeneffekt automatisch korrigiert wird.

Wenn Sie eine JetDirect Plus3 3-Port Box besitzen, besitzen die Queues die Bezeichnungen »raw1«, »text2« usw.

In einem großen Netz, in dem einige Drucker kein PostScript unterstützen, könnte es sinnvoll sein, einen Print-Server einzurichten, auf dem alle Rechner drucken und auf dem alle Ghostscript-Jobs laufen.

Dies erlaubt Ihrem Linux-Rechner auch, als Spool-Server zu arbeiten, so daß die Netzwerkbenutzer ihre Druckaufträge schnell beenden und weiterarbeiten können, ohne darauf warten zu müssen, daß der Drucker erst fremde Aufträge fertigstellt.

Um dies zu erreichen, richten Sie eine Queue auf Ihrem Linux-Rechner ein, die auf den HP Laserjet mit Ethernetkarte verweist (siehe oben). Nun stellen Sie alle Clientrechner in Ihrem LAN so ein, daß sie die Linux-Queue benutzen (z.B. lj-5 im Beispiel oben).

Anscheinend beachten einige HP Netzwerkdrucker die Deckblatteinstellungen nicht, die von den Clients geschickt werden; Sie können das intern generierte Deckblatt abschalten, indem Sie sich per telnet auf den Drucker einloggen, zweimal Return drücken und danach banner: 0 gefolgt von quit eingeben. Sie können auch andere Einstellungen auf diese Art verändern; tippen Sie ? ein, um eine Liste angezeigt zu bekommen.

Alte HP-Drucker

Einige Drucker und externe Druckserver haben zwar eine Ethernetschnittstelle, unterstützen jedoch nicht das lp-Protokoll. Oftmals finden statt dessen spezielle Treiber Verwendung, die für Linux natürlich nicht existieren. Einige dieser Geräte speichern Druckaufträge auch nicht zwischen, so daß es einen Rechner geben muß, der Druckjobs sammelt und nacheinander an den Drucker schickt.

Erwähnenswert in dieser Kategorie sind frühe JetDirect und einige JetDirectEx Karten. Grundsätzlich muß man zum Drucken auf diesen Drucker eine TCP-Verbindung zu dem Drucker auf einem bestimmten Port (typischerweise 9100, oder 9100, 9101 und 9102 für 3-Port Boxen) öffnen und den Druckauftrag hier durch schicken. Das kann u.a. in Perl implementiert werden:

#!/usr/bin/perl
# Dank gebührt Dan McLaughlin, der die Originalversion 
# dieses Skriptes geschrieben hat.

$fileName = @ARGV[0];

open(IN,"$fileName") || 
  die "Kann Datei $fileName nicht öffnen";

$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 $!;
}
# Gibt dem Socket eine Adresse
if (bind(S, $this)) {
#    print "bind ok\n";
}
else {
    die $!;
}

# Ruft den Server auf.

if (connect(S,$that)) {
#    print "connect ok\n";
}
else {
    die $!;
}

# Setzt Befehlspuffer für den Socket.

select(S); $| = 1; select(STDOUT);

#   print S "@PJL ECHO Hi $hostname! $ends";
#   print S "@PJL OPMSG DISPLAY=\"Job $whoami\" $ends";
#   print S $dpi300;

# Durch Aufteilung Deadlock verhindern.

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 Filter für Netzwerkdrucker

Eine Eigenart von lpd ist, daß ein if für Netzwerkdrucker nicht aufgerufen wird. Wenn das nötig sein sollte, kann man eine doppelte Warteschlange einrichten und den Job an die zweite Warteschlange weitergeben. Ein Beispiel für eine passende printcap könnte so aussehen:

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:

Das passenden filter-lj-5-Script wäre dabei:

#!/bin/sh
gs <options> -q -dSAFER -sOutputFile=- - | \
        lpr -Plj-5-remote -U$5

Die Option -U von lpr funktioniert nur, wenn lpr als ein Daemon gestartet wurde und setzt den Namen des Auftraggebers in der weitergegebenen Warteschlange. Man sollte eventuell eine stabilere Methode verwenden, um den Benutzernamen zu ermitteln, denn manchmal ist es nicht Argument 5. Weitere Informationen finden sich in der Manual Page zur printcap.

11.7 Windows Client

Drucken von einem Windows (oder wohl auch OS/2) Client auf eine Linuxmaschine wird über SMB direkt unterstützt, wenn man das Samba-Paket benutzt, das auch die Benutzung Ihres Linux-Filesystems von Windows aus ermöglicht.

Samba beinhaltet eine ziemlich vollständige Dokumentation, und es gibt die recht gute Samba-FAQ, welche sich ebenfalls damit beschäftigt. Sie können entweder einen Magic-Filter auf dem Linuxrechner einrichten und PostScript darauf ausgeben, oder druckerspezifische Treiber auf allen Windows-Maschinen installieren und eine Queue ganz ohne Filter benutzen. Sich auf die Windows-Treiber zu stützen sorgt manchmal für ein besseres Druckbild, ist aber etwas mehr administrativer Aufwand bei vielen Windows-Rechnern. Sie sollten es daher zuerst mit PostScript versuchen.

11.8 Apple Client

Netatalk unterstützt das Drucken von Apple-Clients über EtherTalk. Siehe hierfür auch die Netatalk HOWTO Page unter:

http://thehamptons.com/anders/netatalk/

11.9 Netware Client

Das ncpfs-Paket beinhaltet einen Daemon namens pserver, der benutzt werden kann, um Dienste für eine NetWare Druck-Queue zur Verfügung zu stellen. Soweit ich es verstanden habe, benötigt dieses System ein »Bindery«-basiertes NetWare, z.B. 2.x, 3.x oder 4.x, mit eingeschaltetem Bindery-Zugriff.

Für mehr Informationen über ncpfs und sein pserver-Programm sollten Sie einen Blick auf die ncpfs FTP-Site unter folgender Adresse werfen:

ftp.gwdg.de:/pub/linux/misc/ncpfs/


Inhalt