Brücken schreiben
The Answer Girl
Wenn die Shell dazwischen funkt…
Wenn, ja, wenn da nicht die Shell wäre… Wer zwischenzeitlich z. B. – so vorhanden – sein Home-Verzeichnis auf dem server (nicht zu verwechseln mit Ihrem Linux-Home-Verzeichnis, obwohl auf einem Samba-Server beides gleich sein kann) betreten wollte, mag sich erstaunt die Augen reiben, warum sie oder ihn statt einer Passwortabfrage ein schnödes Not enough '\' characters in service erwartet.
Aufmerksame Answer-Girl-Leser/innen wissen da natürlich längst Bescheid: Der Backslash \ wird in den gängigen Shells als Fluchtzeichen ("Escape"-Zeichen) benutzt, das – einem Sonderzeichen vorangestellt – dessen wörtliche Bedeutung anstelle der übertragenen forciert. Dadurch wurde aus dem ersten \\ nach der Interpretation durch die Shell ein einfacher \, und von \sharename blieb gerade noch ein sharename übrig.
In unserem Fall wollen wir natürlich, dass die Backslashs echte Backslashs bleiben und nicht mit ihrem Escape-Zeichen-Job anfangen. Die Lösung ist einfach: Wir "escapen" den Escaper… Zu diesem Zweck schreiben wir einfach vor jeden \, den wir raus bekommen wollen, einen weiteren :
smbclient \\\\server \\sharename -W arbeitsgruppe -U SMB-benutzername
Nicht browsen, sondern drucken
Nun ist das zwar alles sehr schön, wenn man mit Befehlen wie cd verzeichnisname ins Share-Unterverzeichnis verzeichnisname wechseln, sich mit ls oder dir dessen Inhalt ansehen, mit get datei die Datei datei vom Share auf die Linux-Platte kopieren oder mit put den entgegengesetzten Weg beschreiten kann. (Wer Kommandozeilen-FTP-Clients bedienen kann, sieht sich hier schwer im Vorteil, da alles schon mal gelernt.)
Doch auf einem Drucker kann man sich mit diesem Wissen bestenfalls durch quit oder exit wieder ausloggen… Der will schließlich nur vorgefertigte, möglichst mundgerecht aufbereitete Dokumente haben, um sie fröhlich auf Papier auszuspucken. Glücklicherweise erklärt die smbclient-man-Page, dass sie mit print ein Kommando im Angebot hat, das über den Befehlssatz diverser FTP-Programme hinaus geht.
Ein beispielsweise im Verzeichnis /tmp eingegebenes
smbclient \\\\server \\drucker -W arbeitsgruppe -U SMB-benutzername [...] Password: geheimes_smb-passwort Domain=[arbeitsgruppe ] OS=[Windows NT 4.0] Server=[NT LAN Manager 4.0] smb:\>print lokale_textdatei
sollte jetzt immerhin dazu führen, dass die auf dem Linux-Rechner in /tmp lagernde ASCII-Textdatei namens lokale_textdatei auf dem Drucker ausgespuckt wird. (Falls sie woanders liegt, kann man das aktuelle Linux-Verzeichnis mit lcd verzeichnisname, also einem lokalen Verzeichniswechsel – "local change directory" – ändern.)
Auf Papier findet sich dann auch einiges – nur nicht ganz genau wie geplant: Ein Text im Treppenstufen-Layout mag zwar künstlerisch wertvoll sein – seinen schnöden Zweck, lesbar zu sein, erfüllt er jedenfalls nicht.
Da war doch mal was mit unterschiedlichen Zeilenendezeichen bei Unix und DOS: Während ein unter Unix erstellter ASCII-Text jede Zeile mit einem "Line Feed"-Zeichen ("LF") abschließt, hätte DOS gern noch einen Schreibmaschinen-Wagenrücklauf (Carriage Return, "CR") davor. Wenn der fehlt, werden die Zeichen der nächsten Zeile nicht "an den Anfang zurück geschoben", und Treppenstufen sind die Folge.
Natürlich ließe sich unser ASCII-File vor dem Ausdruck beispielsweise mit unix2dos auf DOS-Gegebenheiten trimmen, aber wer wird denn das jedes Mal von Hand tun wollen?
Da es sich um ein derartig grundlegendes Problem handelt, wäre es doch gelacht, wenn der smbclient es nicht selbst kennen würde. Es bedarf nur ein wenig Geduld und Sucherei:
smb: \> help ls dir du lcd cd pwd get mget put mput rename more mask del open rm mkdir md rmdir rd prompt recurse translate lowercase print printmode queue cancel quit q exit newer archive tar blocksize tarmode setmode help ? !
Beim Durchschauen der smbclient-Befehle sticht einer ins Auge: Was will smbclient denn eigentlich "übersetzen" (engl.: "translate"), wenn nicht solche Kodierungsprobleme? Tatsächlich: ein
smb: \> help translate
HELP translate:
toggle text translation for printingbestätigt, dass wir vermutlich ins Schwarze getroffen haben. Dann probieren wir das doch gleich mit unserer Treppenstufendatei aus:
smb: \> translate CR/LF<->LF and print text translation now on smb: \> print lokale_textdatei putting file lokale_textdatei as lokale_textdatei (0.181909 kb/s) (average 0.181909 kb/s)
Et voilà – das hätten wir. Wer allerdings eine PostScript-Datei auf diese Art und Weise los werden will, weiß hoffentlich, wie man Druckjobs auf dem Drucker abbricht, denn tonnenweise Papier mit PostScript-Programmcode wollte man ja eigentlich nicht haben. Glücklich, wer in dieser Situation an einen PostScript-Drucker gerät, mit dem die Interpretation des Code das Licht der Welt erblickt. Doch spätestens, wenn diese Glücklichen anfangen, ein gif- oder jpg-Bildchen auf diese Weise ausdrucken zu wollen, ist auch hier Schluss mit Lustig.



