Gut gedruckt
The Answer Girl
Nix mit interaktiv
Problematisch ist eigentlich nur, dass das Inputfilterskript keinerlei Interaktivität zulässt – man kann aus dem Hintergrund nicht eben mal nachfragen, ob der ausdruckende Nutzer auch tatsächlich einen SMB-Usernamen vor- und sich mit dem richtigen Passwort ausweisen kann.
Wollten wir das nachprüfen, wären wir ein paar Answer-Girls beschäftigt, und so nehmen wir seufzend in Kauf, dass wir davon ausgehen müssen, dass auf unserem Rechner niemand wirklich Drucker-Unbefugtes einen Account besitzt.
Schlimmer noch als die Schwierigkeit mit dem SMB-User wiegt die Tatsache, dass wir das SMB-Passwort im Klartext abspeichern sollen. Zwar könnten wir das if-Skript beliebig um das Auslesen und Dekodieren eines verschlüsselt abgespeicherten Passworts verkomplizieren. Doch da auch das keine Sache von zwei Zeilen ist, schieben wir den Schwarzen Peter unserem Windowsadministrator zu: Soll der doch ein Konto einrichten, das wirklich nur zum Drucken auf dem entsprechenden Gerät genutzt werden kann. Wir unsererseits sorgen (beispielsweise mit 511 smbprint) zumindest dafür, dass lediglich der Besitzer Leserechte auf die Filterdatei erhält (Schreibrechte sind sowieso out).
Die Besitzerin des Skripts in Listing 1 bin immer noch ich, doch eigentlich würde ich die Bürde gern los werden: Wieso soll ausgerechnet bei einem linuxrechnerweit verfügbaren Drucker ein Skript ausgeführt werden, das in meinem Homeverzeichnis liegt?
Eine vom Red-Hat-printtool (vgl. Kasten "printtool und Co.") erzeugte /etc/printcap weist den Weg: Hier kommt zwar nicht unser schönes selbst gestricktes if-Skript zum Einsatz, sondern ein ähnliches namens – hätten Sie's gedacht? – smbprint (bei SuSE heißt es übrigens samba_print), doch das macht ja nichts.
printtool und Co.
Grafische Frontends wie das Red-Hat'sche printtool können auch nicht hexen. Alles, was sie tun, ist, eine Eingabemaske zur Verfügung zu stellen, in der sie die benötigten Daten abfragen (Abbildung 2), und damit im Wesentlichen nichts weiter zu veranstalten, als das, was wir in diesem Artikel auch machen.
Für einen SMB/Windows 95/NT Printer (Abbildung 1) erzeugt printtool einen Eintrag in der /etc/printcap, der wie folgt aussieht:
##PRINTTOOL3## SMB ljet4 600x600 a4 {} LaserJet4 Default 1
remote|hplj4p:\
:sd=/var/spool/lpd/ljet4:\
:mx#0:\
:sh:\
:if=/var/spool/lpd/ljet4/filter:\
:af=/var/spool/lpd/ljet4/acct:\
:lp=/dev/null:
Bis auf den Parameter af, der ein für unsere Belange nicht unbedingt nötiges "Accounting file" festlegt, ist uns außer der ersten Zeile alles schon bekannt. In Zeile 1 versteckt printtool in einer speziell formatierten Kommentarzeile Informationen, die es für seinen Druckerfilter braucht.
Red Hats rhs-printfilters sind um einiges unübersichtlicher (da weniger modular) als das von uns verwendete magicfilter-Paket [4]. So verwundert es nicht, dass der Inputfilter filter, den Red Hat zusammen mit einigen Konfigurationsdateien im Spoolverzeichnis des betreffenden Druckers ablegt, noch nicht das Ende vom Lied ist, sondern neben der Filterei überhaupt erst das hauseigene smbprint-Skript aufruft.
SMB-Passwort und Benutzername, den Server, der den freigegebenen Drucker beherbergt, sowie dessen SMB-Namen legt printtool im Spoolverzeichnis in einer Datei namens .config ab. Da smbprint jene erst einlesen und auswerten muss, verwundert es nicht, dass es etwas komplexer als unser selbst geschriebenes ausfällt.
Warum platzieren wir es nicht einfach im Spoolverzeichnis des betreffenden Druckers (/var/spool/lpd/ljet4 in Listing 1) und ändern den if-Eintrag in der Printcap von :if=/home/trish/bin/smbprint: auf :if=/var/spool/lpd/ljet4/smbprint:? Die Besitzverhältnisse in diesem Directory weisen dann (hoffentlich!) schon darauf hin, dass der Druckermanager möglichst ein eigener Benutzer namens lp o.ä. ist.
Es muss nicht immer root sein
Manche Distributionen tragen hier allerdings root ein, was sicherheitstechnisch gesehen totaler Overkill ist: Wer Dinge, die sich auch ohne rootsche Allmächtigkeit von speziell berechtigten Usern ausführen lässt, der Systemadministratorin zuschustert, handelt im Allgemeinen grob fahrlässig.
Und wenn wir schon einmal sicherheitsbewusst denken, so schreiben wir nicht nur den Namen des im Skript verwendeten Programms smbclient hinein, sondern auch den Pfad (/usr/sbin) dahin. So schließt man aus, dass ggf. ein unerwünschtes, jedoch ebenfalls im Suchpfad liegendes smbclient benutzt wird.
Wie dem auch sei – aufmerksame Leser(innen) haben schon bemerkt, dass Listing 2b noch zwei Änderungen zur Version aus Heft 06/00 (Listing 2a) enthält: Statt den Windows-typischen Backslashes \ als "Verzeichnistrenner" im Share-Namen \\server\drucker, die zudem noch zu \\\\server\\drucker "escapt" werden mussten, lässt smbclient auch die "unixoide" Schreibweise mit / statt \ zu. Da der einfache Slash gemäß seiner Sonderbedeutung als "Verzeichnistrennzeichen" eingesetzt wird, brauchen wir hier keine Fluchtzeichen.
Schließlich wird noch ein logfile als Variable definiert, eine Datei namens smb-print.log im Verzeichnis /var/log, in dem Systemprogramme, normalerweise unterstützt vom System-Log-Dämon syslogd, mitprotokollieren, was ihnen im Laufe ihres Arbeitslebens so alles widerfährt.
Durch Voranstellen eines $ holen wir uns ganz am Ende den Inhalt der Variablen, also /var/log/smb-print.log, um ans Ende dieser Datei durch den "Doppelpfeil" >> all das anhängen zu lassen, was smbprint an Meldungen von sich gibt. Da wir im Laufe unserer Tests schon festgestellt haben, dass dazu keine Zeitangabe gehört, lassen wir uns die durch das Kommando date voranstellen.
lpr/lpd oder lprng?
Welches Print-Spooling-System man installiert hat (bzw. ob überhaupt), erfährt man vom Paketmanager seiner Distribution:
rpm -qa | lprz.B. bei SuSE, Caldera, Red Hat und Derivatendpkg -l | grep lprbei Debian und Abkömmlingen Einen Hinweis auflprngerhält man u.U. auch vomps-Kommando. Spucktps -auxw | grep lpdin der ersten Spalte aus, dass der Lineprinter-Dämonnichtvonroot, sondern beispielsweise dem Benutzerlpgestartet wird, haben Sie's auf jeden Fall mit dem "nextgeneration"-lpdzu tun.lprngwurde u.a. auch deshalb entwickelt, damit man denlpdnicht mehr mitroot-Rechten starten muss.



