Zurück Weiter Inhalt

10. Wie man einen Drucker über ein Netzwerk benutzt

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

10.1 Auf einem UNIX/lpd Host

Um es anderen Rechnern zu ermöglichen, auf dem eigenen Drucker zu drucken, müssen diese in /etc/hosts.equiv oder /etc/hosts.ldp aufgelistet werden. Achtung: hosts.equiv hat viele weitere Effekte; man sollte sich sicher sein, was man tut, wenn man hier einen Rechner auflistet. Man kann auch nur bestimmten Benutzern des anderen Rechners erlauben, zu drucken. Dazu nutzt man das rs-Attribut; siehe dazu lpd man page.

10.2 Mit lpd

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

# NETZWERK djet500
lp|dj|deskjet:\
        :sd=/var/spool/lpd/dj:\
        :rm=geraet.da.draussen.com:\
        :rp=printername:\
        :lp=/dev/null:\
        :sh:

Es gibt weiterhin ein Spool-Verzeichnis auf dem lokalen Rechner, das von lpd verwaltet wird. Wenn der Netzwerkrechner beschäftigt oder nicht erreichbar ist, bleiben Druckaufträge des lokalen Rechners in dem Spoolverzeichnis, bis sie gesendet werden können.

10.3 Mit 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, lpd entsprechend einzurichten. Das ist besonders sinnvoll, wenn man nur selten auf vielen verschiedenen Druckern druckt. Aus der Ankündigung von rlpr:

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

Anders als 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 rückwärts-kompatibel zum traditionellen BSD lpr.

Der Hauptvorteil von lprl 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. Es kann genau wie das traditionelle lpr wie ein Filter funktionieren, so daß Clients, die auf einem Netzwerkrechner laufen (z.B. Netscape, XEmacs, etc) ohne größere Probleme auf dem lokalen Rechner drucken können.

Rlpr ist erhältlich von sunsite.unc.edu:/pub/Linux/system/Printing/.

10.4 Auf einem Win95, WinNT, LanManager oder Samba-Drucker

Es ist möglich, eine lpd-Warteschlange mit dem smbclient-Programm (ein Teil des Samba-Pakets) zu einem TCP/IP-basierenden SMB-Druckservice zu schicken. Dafür kommt mit Samba 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:

Man sollte die Dokumentation im smbprint-Skript lesen, um weitere Informationen zu erhalten.

Man kann auch den smbclient verwenden, um eine Datei direkt an einen SMB-Druckservice zu schicken ohne lpd zu benutzen. Siehe Man-page.

10.5 Auf einem Netware-Drucker

Im ncpfs-Paket ist ein Programm namens nprint, daß die gleichen Funktionen wie smbprint für NetWare hat. ncpfs ist erhältlich bei linux01.gwdg.de:/pub/ncpfs/. Aus dem LSM-Eintrag zur 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. (Mit ncpfs kann man Laufwerke auf dem Netzwerk-Server unter Linux mounten. Man kann auch in Netware-Warteschlangen druchen und Netware-Warteschlangen in das Linux Drucksystem spoolen. Man benötigt Kernel 1.2.x oder 1.3.54 oder hoeher. ncpfs funktioniert NICHT mit 1.3.x-Kernels unter 1.3.54.)

Damit nprint über lpd arbeitet, schreibt man ein kleines Shellscript um stdin auf dem Netware-Drucker zu drucken und installiert es als if für eine lpd Warteschlange. Man erhält so etwas wie:

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
/usr/local/bin/nprint -S net -U name -P passwd -q printq-q -

10.6 Auf einem EtherTalk- (Apple-) Drucker

Im netatalk-Paket ist etwas wie nprint und smbclient enthalten. Werner Eugster hat die Einstellungen, um auf einem Apple-Netzwerk zu drucken, besser beschrieben, als es der Autor je könnte, siehe seine Webseite (http://garnet.berkeley.edu/~weugster/appleprint.html).

Obskure Warnung der Woche: Netatalk funktioniert nicht mit einer SMC Etherpower PCI-Karte mit einem DEC Tulip-Chip.

10.7 Auf einem HP oder anderem Ethernet-Drucker

HPs und einige andere Drucker haben ein Ethernet-Interface, auf dem man direkt mit lpd drucken kann. Man sollte den Anweisungen folgen, die mit dem Drucker oder Netzwerkadapter geliefert wurden, aber generell lassen solche Drucker lpd "laufen" und stellen eine oder mehrere Warteschlangen zur Verfügung. Ein HP zum Beispiel könnte 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:

In einem großen Netz, besonders einem großen Netz, in dem einige Drucker kein PostScript unterstützen, ist ein sinnvoll, einen Print-Server zu nutzen, auf dem alle Rechner drucken und auf dem alle Ghostscript-Jobs laufen.

Auf alten HPs

Einige Drucker unterstützen nur ein kleines "Nicht-Protokoll" mit reinen TCP-Verbindungen. 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) öffnen und den Druckauftrag hierdurch schicken. Das kann in Perl implementiert werden:

#!/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 "Kann Datei $fileName nicht oeffnen";

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

10.8 Ein if für Netzwerkdrucker

Eine Besonderheit von lpd ist, daß if für Netzwerkdrucker nicht aufgerufen wird. Wenn das nötig sein sollte, kann man eine doppelte Warteschlange einstellen und den Job an die zweite Warteschlange weitergeben: Beispiel für eine passende printcap:

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:

mit diesem filter-lj-5-Script:

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

Die -U-Option bei lpr funktioniert nur, wenn lpr als ein Daemon gestartet wurde und setzt den Namen des Auftraggebers in der weitergegebenen Warteschlange. Man sollte eventuell eine robustere Methode verwenden, um den Usernamen zu ermitteln, denn manchmal ist es nicht Argument 5. Siehe auch die Man-page zu printcap.


Zurück Weiter Inhalt