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 sorgfältigen Kombination von Filterskripten und anderen Utilities kann man mit lpr transparent auf allen möglichen Druckern über alle möglichen Netzwerke drucken.
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, auf dem eigenen Drucker
zu drucken, indem man das rs
-Attribut benutzt; siehe dazu
auch die
lpd Man-page
für mehr Informationen.
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:
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, 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 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. Es 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/
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. 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. Hierzu siehe die Man-page.
Im ncpfs-Paket ist ein Programm namens nprint
enthalten, das
die gleichen Funktionen wie smbprint
für NetWare
bietet. ncpfs ist erhältlich bei:
ftp://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. 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
# You should try the guest account with no password first!
/usr/local/bin/nprint -S net -U name -P passwd -q printq-name -
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.
HPs und einige andere Drucker besitzen 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:
HP Laserjet Drucker mit JetDirect Interface stellen im allgemeinen zwei eingebaute Queues zur Verfügung - "raw", die PCL (und eventuell PostScript) akzeptiert, und "text", die reines ASCII erwartet (und automatisch den Treppeneffekt korrigiert). Wenn Sie eine JetDirect Plus3 drei-Port Box besitzen, besitzen die Queues die Bezeichnungen "raw1", "text2" usw.
In einem großen Netz, besonders 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 einen Telnet auf den Drucker ausführen, zweimal Return drücken und danach "banner: 0" gefolgt von "quit". Sie können auch andere Einstellungen auf diese Art verändern; tippen Sie "?" ein, um eine Liste angezeigt zu bekommen.
Einige Drucker (und Drucker-Netzwerk "Black Boxes") 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, oder 9100, 9101 und 9102 für drei-Port Boxen) öffnen und den Druckauftrag hierdurch schicken. Das kann u.a. 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;
}
Eine Eigenart 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: Ein 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 passenden 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 stabilere
Methode verwenden, um den Usernamen zu ermitteln, denn manchmal ist
es nicht Argument 5. Siehe auch die Man-page zu
printcap
.
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 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.
Netatalk unterstützt das Drucken von Apple-Clients über
EtherTalk. Siehe hierfür auch die Netatalk HOWTO Page
(http://thehamptons.com/anders/netatalk/
).
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 werfen
(ftp://ftp.gwdg.de/pub/linux/misc/ncpfs/
).