The Answer Girl

Aus LinuxUser 12/2000

The Answer Girl

24 Mal werden wir noch wach

Dass der Computeralltag auch unter Linux des Öfteren für Überraschungen gut ist, ist eher eine Binsenweisheit: Immer wieder funktionieren Dinge nicht oder nicht so, wie eigentlich angenommen. Das Answer-Girl im LinuxUser zeigt, wie man mit solchen Problemchen elegant fertig wird.

Mit Riesenschritten marschieren alle Jahre wieder Knecht Rupprecht, der Nikolaus, das Christkind, der Weihnachtsmann und – um diese Aufzählung zumindest mit ein wenig grammatikalischer Weiblichkeit zu schmücken – die vier Adventssonntage heran. Spätestens jetzt haben die Lebkuchenberge in jedem Supermarkt (und fast jeder Tankstelle) die Überhand gewonnen und das große Kind in Frau und Mann heraus gekitzelt.

Wer es bislang versäumte, seine Plüschpinguinin mit einer jener unsäglichen rot-weißen Mützen auszustaffieren, braucht wenigstens eines, um dem Rest der Menschheit zu beweisen, dass man – selbst wenn man ständig am Rechner hockt – durchaus auch ein wenig Sinn für vorweihnachtlich-heimelnde Atmosphäre hat: Ein Adventskalender muss her.

Treue LinuxUser-Leser/innen wollen jetzt sicher nicht schon wieder eine CGI-Variante an dieser Stelle sehen – die lässt sich schließlich aus dem Linux-Magazin 12/1999 (“Es WWWeihnachtet sehr” S. 70ff. und Answer-Girl “Spicken nicht erlaubt” S. 80ff.) recyclen. Deshalb sind wir heute etwas kreativ und lassen uns was Anderes einfallen…

Leise rieselt die Mail

Wie wär’s z.B., wenn wir unseren Lieben jeden Tag eine kleine Überraschungsmail in den E-Post-Kasten steckten? Da mittlerweile nur noch wirklich hartgesottene Mitmenschen einen Mailreader ohne MIME-Funktionalität benutzen, bietet es sich an, jeden Tag ein anderes Attachment dranzuhängen.

Beginnen wir also damit, 24 Bildchen, Gedichte u.a. Text enthaltende Dateien, vielleicht ein paar hübsche ASCII-Art-Schnipsel, einige animierte Gifs, eine nette URL-Sammlung und vielleicht sogar den einen oder anderen MP3-Fetzen zu erstellen und/oder zusammen zu suchen und sie in einem passenden, z.B. mit mkdir -p ~/adventskalender/inhalt erstellten Verzeichnis abzulegen. Das -p wie “parent” – “Eltern(verzeichnis)” – sorgt dabei dafür, dass inhalt auch dann erzeugt wird, wenn das übergeordnete adventskalender noch gar nicht existiert. Letzteres wird einfach mit angelegt.

Ein ls -sSk1 ~/adventskalender/inhalt verrät uns im Laufe der Sammelaktion, welches der zusammen gesuchten Nicht-ASCII-Files wir schweren Herzens wieder rauswerfen müssen, da es stark gegen ein halbes oder gar mehr Megabytes tendiert und damit die immer noch zahlreichen Vertreter/innen der Modemfraktion nicht gerade glücklich macht.

Das kleine -s bedeutet ls, neben dem Dateinamen auch noch die Größe (“size”) anzugeben, und das Ganze in – -kKilobyte-Blöcken. (Da Blöcke und nicht Bytes gezählt werden, ist das Ergebnis größer als erwartet. Aber zur Abschätzung reicht’s…) -Ssortiert die Dateien nach ihrer Größe, die großen voran. -1 sorgt dann noch dafür, dass alle Dateien in einer Spalte untereinander (also eine Datei pro Zeile) aufgelistet werden.

Jetzt geht es noch darum, die Reihenfolge festzulegen, in der diese Dateien verschickt werden sollen – das “Morgen, Kinder, wird’s was geben”-MP3 soll schließlich genau am 23. Dezember aus ~/adventskalender/inhalt geholt werden. Am einfachsten geht das, indem wir jeder Datei ein Präfix 01_ bis 24_ im Namen verpassen, beispielsweise mit mv nikolaus.gif 06_nikolaus.gif.

So viel Heimlichkeit

Wenn die Dateinamen lang werden und sich zu sehr ähneln, sodass mehrere Anläufe mit Zeichenergänzungen nötig werden, um mit der Tabulatortastedie nötigen Dateinamenserweiterungen auf den Weg zu bringen, bietet die Basheine interessante Erleichterung.

Wer an ungemütlichen Winterabenden in der Bash-Manpage stöbert, stößt auf drei interessante Abschnitte namens Event Designators, Word Designators und Modifiers. Das, was dort – leider ohne Beispiele – beschrieben wird, sind Möglichkeiten, frühere Kommandos zu recyclen.

Unter Event Designators finden wir das für unsere Zwecke interessant erscheinende Kürzel !#, mit dem man in einer noch nicht fertig getippten Kommandozeile einen Stellvertreter für alles bisher schon eingetippte einfügen kann.

Unter Modifiers finden wir den Hinweis, dass uns ein :p (für “print” – “nur ausdrucken), angefügt an alle vorherigen Designatoren, das fertig ersetzte Kommando zu Gesicht bringt, es jedoch nicht ausführt. Sicher eine Option, die wir jetzt zum Testen gut gebrauchen können. Ein mv nikolaus.gif !#, getestet mit

[trish@lillegroenn trish]$ mv nikolaus.gif !#:p
mv nikolaus.gif mv nikolaus.gif

erzeugt also genau das, was wir erwarten: mv nikolaus.gif doppelt.

Das ist nun noch nicht besonders sinnvoll, aber wozu gibt es die Wort-Designatoren? Ein Doppelpunkt nach dem Event-Modifikator, dahinter eine 1 holt das erste Wort aus !# heraus. Da die Shell bei Null zu zählen anfängt, handelt es sich hierbei genau um das Wort nikolaus.gif:

[trish@lillegroenn trish]$ mv nikolaus.gif !#:1:p
mv nikolaus.gif nikolaus.gif

Damit kommen wir jetzt ganz leicht zum gewünschten Kommando mv nikolaus.gif 06_nikolaus.gif: mv nikolaus.gif 06_ eintippen und mit !#:1 das Wort Nr. 1 namens nikolaus.gif wiederholen lassen (mv ist Nr. 0, 06_ Nr. 2). Et voilà:

[trish@lillegroenn trish]$ mv nikolaus.gif 06_!#:1
mv nikolaus.gif 06_nikolaus.gif

– nun ohne :p der Ernstfall – führt genau das Kommando aus, das wir wollten.

Kling Glöckchen

Damit wäre auch schon die Hauptarbeit erledigt. Wer es etwas persönlicher haben mag, kann dazu noch ein Anschreiben für jeden Tag entwerfen – wir sind faul und schreiben lediglich ein einziges in eine Datei namens ~/adventskalender/einleitung mit Platzhaltern für den Tag (<tag>) und die verbleibenden Nächte (<x>). Etwa so:

<x>x werden wir noch wach...
Guten Morgen!
Du darfst heute das <tag>. Tuerchen
Deines E-Mail-Adventskalenders oeffnen.
                Dein Wichtel

Damit muss eigentlich nur noch irgendjemand jeden Tag hergehen, ~/adventskalender/einleitung mit den aktuellen Werten für <tag> und <x> versehen, in eine Mail einlesen, das passende Attachment anhängen und an die zu beglückende(n) Mailadresse(n) senden. Kein größeres Problem, denn es gibt ja Cron (siehe auch den Artikel “Diener auf die Minute” in diesem Heft) – und Sie haben hoffentlich einen eigenen Mailserver wie z.B. den im Answer-Girl in Heft 10/2000 aufgesetzten Postfix auf Ihrem Rechner laufen. Ehe wir den Auftrag in die Crontabelle schreiben, sollten wir uns allerdings überlegen, wie sich eine Mail ohne direkte menschliche Einwirkung verschicken lässt.

Aufmerksame Leser/innen werden sich jetzt sicherlich daran erinnern, dass in besagter Answer-Girl-Ausgabe das äußerst rudimentäre Mailprogramm mail zum Schreiben von Testmails auf der Kommandozeile eingesetzt wurde. Mit -s wie “Subject” als Argument lässt sich direkt von der Kommandozeile ein netter Betreff angeben, in Anführungszeichen gesetzt, darf er sogar aus mehreren Wörtern bestehen. Dahinter die E-Mailadresse, und damit fehlt uns nur noch eine Möglichkeit, den Inhalt von ~/adventskalender/einleitung in den Mailbodyzu “schütten”.

Vermutlich haben auch Sie schon das eine oder andere Mal die Ausgabe eines Kommandos mit dem >-“Pfeil” in eine Datei umgelenkt. Warum sollte das nicht auch in der Gegenrichtung funktionieren? Tatsächlich kennt die Shell den Umlenkungsoperator <, der den Inhalt einer Datei in die Standardeingabe eines Kommandos “hinein stopft”. Unser Mailkommando sähe damit also so aus:

[trish@lillegroenn Answergirl]$ mail -s "Das Adventskalendertuerchen" trish < ~/adventskalender/einleitung 

Da wir unsere Überraschung ja noch nicht verraten wollen, schicken wir die Testmail natürlich an die eigene (lokale) Mailadresse, in diesem Beispiel trish.

Das ist sicher sehr schön – nur hilft auch ein noch so gründliches Studium der mail-Manpage nicht weiter, wenn es darum geht, das Attachment anzuhängen. Das kann mail nämlich nicht. Wer sich ein wenig mit MIME auskennt, könnte hier sicherlich einiges drehen, doch wollen wir es wirklich so kompliziert haben? Nicht in diesem Answer-Girl!

Es gibt schließlich noch weitere E-Mailclients für die Kommandozeile. Einer davon, mutt, ist nicht nur sehr weit verbreitet, sondern entpuppt sich als wahrer Glückstreffer für unser Anliegen. Ein mutt --help beliefert uns nicht nur mit einer riesigen Auswahl an Möglichkeiten, sondern dient uns gleich noch die richtigen Optionen an:

-a <file>     haengt die Datei <file> an die Mail an
-s <subj>     legt ein Subject fest (muss in Gaensefuesschen stehen, wenn es Leerzeichen enthält)

Mit einem

[trish@lillegroenn Answergirl]$ mutt -s "Das Adventskalendertuerchen" -a ~/adventskalender/inhalt/06_nikolaus.gif trish < ~/adventskalender/einleitung 

hätten wir genau das verschickt, was am 6. Dezember der Ernstfall werden soll.

Vorfreude, schönste Freude

Wenn man von dem unbedeutenden Detail absieht, dass wir jeden Tag ein anderes Attachment versenden und zudem noch die beiden Platzhalter in der einleitung ersetzen wollen, wäre das genau der Auftrag für Cron. Diese eine Zeile bekämen wir problemlos in der Crontabelle unter, doch schwant uns jetzt, dass dem mit den Details nicht mehr so sein wird. Also setzen wir uns hin und schreiben ein kleines Shellskript.

Die erste Zeile ist schon mal klar: #!/bin/sh -vx, der “Kommentar” für den Kernel, dass der folgende Code von /bin/sh ausgeführt werden soll, auf Linuxsystemen normalerweise ein Link auf /bin/bash. Die Optionen -xv werden wir später für den “Produktionsbetrieb” rauswerfen, aber im Moment helfen sie uns bei der Fehlersuche – oder sollten wir etwa keine machen? -v, so verrät uns die Manpage zu bash, wird alle Zeilen des Skripts ausgeben, sobald sie gelesen wurden (“verbose”), -x hingegen die Kommandos mit allen (von der Shell vorgenommenen) Ersetzungen, so wie sie ausgeführt werden (“execute”).

Dann geht es den Lücken in unserem Einleitungstext an den Kragen. Als Erstes brauchen wir das Datum des aktuellen Tages. Was böte sich da besser an als das Kommando date? Auf der Manpage erfahren wir, dass uns nicht nur vollständige Datumsangaben mit Wochentag, Monat, Tag, Uhrzeit, Zeitzone und Jahr à la

[trish@lillegroenn Answergirl]$ date
Mon Nov  6 05:58:38 CET 2000

geboten werden, sondern sich mit einem %d der Monatstag in zweistelliger Schreibweise (also 01 bis 31) heraus holen lässt, wenn wir mit einem Plus den “Formatierungsmodus” einschalten:

[trish@lillegroenn Answergirl]$ date +%d
06

Das Datum packen wir am besten zum Merken in eine Variable namens DATE:

[trish@lillegroenn Answergirl]$ DATE=`date +%d`
[trish@lillegroenn Answergirl]$ echo $DATE
06

Dabei sorgen die Backticks (` `) dafür, dass das dazwischen stehende Kommando zunächst ausgeführt wird und erst sein Ergebnis in DATE gespeichert wird. Mit dem Dollar ($) vor dem Variablennamen greifen wir auf den Inhalt zu, und siehe da, DATE enthält tatsächlich den aktuellen Monatstag.

Damit können wir schon mal das <x> in einleitung ersetzen: Der “Stream Line Editor” sed tut das für uns, wenn wir ihm ein Substitutionskommando der Form s/zu ersetzender Text/Ersatztext/ zur Ausführung (“execution”: -e) mit auf den Weg geben:

[trish@lillegroenn Answergirl]$ sed -e "s/<tag>/$DATE/" ~/adventskalender/einleitung
<x>x werden wir noch wach...
Guten Morgen!
Du darfst heute das 06. Tuerchen[...]

Nunja, ein 06. Türchen sieht vielleicht ein wenig zu pedantisch aus. Aber auch hier lässt sich die Null mit einem s/0// von sed durch Nichts ersetzen, wenn wir den Inhalt des aktuellen DATE mit echo ausgeben und mit der Pipe| in den sed-Befehl einspeisen. Das Ergebnis dieses Befehls weisen wir wieder DATE zu. Ups… und was passiert am 10. und 20. Dezember? Damit da kein Monatsanfang draus wird, müssen wir sed noch sagen, dass er nur Nullen am Wortanfang (^) wegnehmen soll:

[trish@lillegroenn Answergirl]$ DATE=`echo $DATE | sed -e "s/^0//"`
[trish@lillegroenn Answergirl]$ sed -e "s/<tag>/$DATE/" ~/adventskalender/einleitung[...]
Du darfst heute das 6. Tuerchen[...]

Leider brauchen wir das alte DATE nochmal, um uns aus ~/adventskalender/inhalt das Tagesattachment rauszuholen.

[trish@lillegroenn Answergirl]$ cd ~/adventskalender/inhalt

Dadurch, dass wir die Files so schön durchnummeriert haben, reicht es, wenn wir uns die Datei schnappen, die mit dem zweistelligen Monatstag beginnt…

[trish@lillegroenn inhalt]$ ls 06*
06_nikolaus.gif

… und diesen zum Merken einer weiteren Variablen, z.B. TUERCHEN, zuweisen:

[trish@lillegroenn inhalt]$ TUERCHEN=`ls $DATE *`
06_nikolaus.gif

Wenn wir das tun, bevor wir DATE seinen neuen Wert ohne ggf. führende Nullen zuteilen, haben wir den Namen unserer Attachmentdatei sicher und können DATE beruhigt überschreiben.

Morgen, Kinder

Ein Austausch in unserem Introtext fehlt noch: <x> muss durch die verbleibenden Nächte bis zum 24. ersetzt werden. Einfache Rechenaufgabe: 24 minus dem aktuellen Tag. Im Gegensatz zu “richtigen” Programmiersprachen kann die Shell leider nicht ordentlich rechnen. Wir können uns lediglich mit expr behelfen, das einen dahinter stehenden Ausdruck auswertet. Dabei gibt’s nur ganzzahlige Rechenoperationen, aber das reicht ja in diesem Fall:

[trish@lillegroenn inhalt]$ expr 24-6
24-6

Hmm, das war dann wohl falsch… Wir wollten doch, dass expr für uns rechnet! Die Manpage führt auf die richtige Fährte: “Each token of the expression must be a separate argument” – jeder Bestandteil unseres zu berechnenden Ausdrucks muss ein separates Argument sein. Dann trennen wir Minuend, Minuszeichen und Subtrahend doch einfach durch Leerzeichen und weisen das Ergebnis der Variablen NAECHTE zu.

[trish@lillegroenn inhalt]$ NAECHTE=`expr 24 - 6`
[trish@lillegroenn inhalt]$ echo $NAECHTE
18

… und siehe da, es klappt: am 6. Dezember sind es noch 18 Nächte bis zum Heiligen Abend.

Diese Anzahl in den Einleitungstext zu bringen, ist eine unserer leichtesten Übungen:

[trish@lillegroenn inhalt]$ sed -e "s/<x>/$NAECHTE/" ~/adventskalender/einleitung
18x werden wir noch wach...[...]

Da sed auch gern mehrere Befehle auf einmal übernimmt, können wir beide Ersetzungen problemlos in einem (zugegebenermaßen länglichen) Rutsch erledigen:

[trish@lillegroenn inhalt]$ sed -e "s/<tag>/$DATE/" -e "s/<x>/$NAECHTE/" ~/adventskalender/einleitung
18x werden wir noch wach...
Guten Morgen!
Du darfst heute das 6. Tuerchen[...]

Versuchen wir jetzt, das Ergebnis (Backticks!) unseres schönen neuen sed-Monsters in mutt zu speisen (der Einfachheit halber ohne Subject- und Attachment-Angabe) …

[trish@lillegroenn Answergirl]$ mutt trish < `sed -e "s/<tag>/$DATE/" -e "s/<x>/$NAECHTE/" ~/adventskalender/einleitung`
bash: : Ambiguous redirect

… spielt die Shell leider nicht mit: Sie ist mit unserer Umleitung (redirect, <) nicht einverstanden. Nun gut, wer mag, kann sich jetzt die Zeit mit mühseliger Fehlersuche um die Ohren schlagen – doch gab’s da nicht auch noch die Pipe? Sollte das mit dem Umsetzen der Ausgabe eines Kommandos (sed) zur Eingabe eines anderen (mutt) auch schief gehen, können wir ja immer noch weiter brüten.

Also versuchen wir der Bash ein Schnippchen zu schlagen:

[trish@lillegroenn inhalt]$ sed -e "s/<x>/$NAECHTE/" -e "s/<tag>/$DATE/" ~/adventskalender/einleitung | mutt trish 

… und es klappt!

Dann nehmen wir noch das Attachment-Argument für mutt hinzu (-a datei) und machen aus dem alten, langweiligen Subject Das Adventskalendertuerchen eines, das verrät, um das wievielte Fensterchen es sich dreht: -s "Das $DATE. Adventskalendertuerchen".

Ihr Kinderlein kommet!

Wer diesen Adventskalender exklusiv für seine/n Liebste/n oder die beste Freundin gebaut hat, ist damit schon aus dem Schneider. Alle Anderen müssen sich jetzt noch Gedanken machen, wie die Mail an mehrere Adressat(inn)en gehen soll, ohne dass gleich alle wissen, dass sie einfach nur Opfer eines Massenmailings geworden sind.

Da hilft die for-Schleife der Bash, die die Kommandos, die zwischen einem dem Schleifenkopf folgenden do und done stehen, so oft ausführt, wie in unserer zu erstellenden Adressliste Empfänger/innen stehen:

[trish@lillegroenn inhalt]$ for ADRESSE in trish pjung@linux-user.de
> do
> sed -e "s/<x>/$NAECHTE/" -e "s/<tag>/$DATE/" ~/adventskalender/einleitung | mutt $ADRESSE
> done

Zum Testen benutzen wir hier natürlich wieder eigene Adressen, hier die lokale Benutzerin trish und die Adresse der Autorin, die Sie vielleicht mit dem fertigen Adventskalender – jedoch bitte nicht mit Ihren Tests beglücken wollen. Beim ersten Schleifendurchlauf erhält die Variable ADRESSEtrish zugewiesen, und die Mail wird an den aktuellen Inhalt ($) dieser Variablen geschickt. Im zweiten Durchgang wird ADRESSE auf pjung@linux-user.de gesetzt, und das Spiel wiederholt sich mit ihrem neuen Inhalt.

Damit ist es an der Zeit, all unsere Bemühungen auch tatsächlich in einem Skript namens adventskal (z.B. unter ~/bin) abzulegen – Listing 1 zeigt das vollständige Progrämmchen.

Listing 1

adventskal, das Adventskalenderskript

#!/bin/sh
# Wo liegen die Programme, die wir brauchen?
PATH=/bin:/usr/bin
# Verzeichnis mit den zu verschickenden
# Attachments
KALENDER="$HOME/adventskalender/inhalt"
# einleitender Mailtext
TEXT="$HOME/adventskalender/einleitung"
DATE=`date +%d`
cd $KALENDER
# Das zu verschickende Attachment hat den
# zweistelligen Monatstag im Dateinamen
TUERCHEN=`ls $DATE*`
# Fuehrende Null weg
DATE=`echo $DATE | sed -e "s/^0//"`
# Wie oft werden wir noch wach?
NAECHTE=`expr 24 - $DATE`
for ADRESSE in          \
        # die Adressen der zu Beglueckendentrish                \pjung@linux-user.de
do
        # Ersetzen der Platzhalter im einleitenden Mailtext
        sed -e "s/<x>/$NAECHTE/" -e "s/<tag>/$DATE/" $TEXT | \
        mutt -s "Das $DATE. Adventskalendertuerchen" \
                -a $KALENDER/$TUERCHEN $ADRESSE
        # ... und ab die Post: Auch das Subject der Mail
        # wird jetzt an den Tag angepasst
done

Darin sind alle Dinge, die sich möglicherweise ändern können, in Variablen definiert: KALENDER enthält das Verzeichnis mit den Attachments in spe, TEXT die Datei mit dem Einleitungstext, und statt ~ verwenden wir die Umgebungsvariable HOME, um das Skript unser Homeverzeichnis heraus finden zu lassen.

Bleibt der PATH. Statt uns auf den Standardpfad zu verlassen, der alles Mögliche enthalten kann, erlegen wir dem Skript strikte Regeln auf, in welchen Verzeichnissen es nach ausführbaren Dateien suchen darf: Da sich alle benötigten Befehle in /bin und /usr/bin befinden (das Kommando which hilft, dies zu prüfen), gehen wir gar kein Risiko ein und lassen z.B. eine zweite mutt-Version, die vielleicht in /usr/local/bin liegt, außen vor.

Draußen vom Walde

Ein bisschen Heimlichtuerei kann in der Adventszeit nie schaden, und daher mag die Eine oder der Andere gern als Absender/in unerkannt, jedoch durchaus für Reply-Mails erreichbar sein. Zwar können wir einen neuen Benutzer wichtel auf unserem System anlegen, in dessen Namen die Mails verschickt werden, doch nützt das nichts, wenn dieser Benutzer nicht per Mail erreichbar ist. Daher ist das Versteckspiel nur interessant für Menschen, deren Rechner selbst Mail aus dem Internet annimmt oder die zumindest eine gültige Mailadresse (z.B. bei einem Freemailer) für wichtel aufzuweisen haben.

Wie der die richtige Umschlags-(Envelope-)adresse bekommt, wurde für Postfix im Oktober-Answer-Girl beschrieben – lesen Sie dort einfach den Abschnitt “Adressmanipulation” nach, in dem sich alles um die sender_canonical-Map drehte. Damit bekommen wir die From-Zeile (ohne Doppelpunkt) im Mailheader richtig hin.

Um den From:-Header hingegen kümmert sich mutt. In der diesem Programm normalerweise beiliegenden Dokumentation (die ASCII-Datei heißt – wie bei den meisten Distributionen ein Blick in /usr/doc/mutt-version zeigen dürfte – manual.txt, auch eine HTML-Version ist erhältlich) kann man so lange stöbern, bis man auf den “Konfigurationsbefehl” my_hdr stößt.

Schreibt man den in seine (oder wichtels) ~/.muttrc (Anlegen, wenn nicht vorhanden!), kann man eigene Header definieren, z.B.

my_hdr From: Wichtel <wichtel@linux-user.de>

Dann wird als Absenderadresse wichtel@linux-user.de angegeben, und Sie müssen Sorge tragen, dass diese Adresse a) auch Mails empfangen kann und diese b) in Ihrer Mailbox landen.

Benutzer/innen, deren Rechner selbst Mails annehmen, haben es hier einfach: Eine Zeile

wichtel: pjung@linux-user.de

in der Alias-Datei des eigenen Mailservers (meist /etc/aliases) und ein newaliases oder (bei Postfix) postalias Aliasdatei zum Aktivieren reichen aus, um sämtliche Mails an den lokalen User wichtel weiter an pjung@linux-user.de zu leiten.

Damit wichtel überhaupt etwas tun kann, muss er natürlich das adventskal-Skript und das adventskalender-Verzeichnis in seinen Homebereich kopieren.

Bald nun ist Weihnachtszeit

Doch egal, ob Sie Ihre Adventskalendermails nun unter Ihrem eigenen Namen oder einer heimlichen Wichteladresse verschicken: Das adventskal-Skript wollen Sie ganz sicher nicht Tag für Tag von Hand aufrufen. Das lassen wir Cron für uns tun und starten daher entweder als wir selbst oder als wichtel den Befehl crontab -e zum Editieren unserer Crontabelle.

Wer nicht zuvor die Umgebungsvariable EDITOR oder VISUAL auf seinen Lieblingseditor gesetzt hat, macht spätestens jetzt Bekanntschaft mit vi. Mit einem i wie “insert” kommt man in den Schreibmodus und kann die eine nötige Zeile in einem Rutsch herunter schreiben: 6.30 Uhr hört sich nach einer guten Versendezeit an – da sind die Spätzubettgeher inzwischen auch in den Federn und der Rest hoffentlich noch im Bett, in der Dusche oder auf dem Weg zur Arbeit. Das Skript soll nur im Dezember (dem 12. Monat) laufen, und auch da nur vom 1. bis 24. Der Wochentag spielt keine Rolle (*) in unseren Überlegungen. In Crontab-Schreibweise sieht das so aus:

30 6 1-24 12 * $HOME/bin/adventskal

Da wir die gesamte komplexe Funktionalität unseres Adventskalenders im in ~/bin abgelegten adventskal-Skript haben, müssen wir in der letzten Auftragsspalte nicht mehr als das eintragen, können uns mit ESC in den Kommandomodus des vi begeben und mit :wq – “write” (“schreiben”) und quit (“schließen”) – hinaus katapultieren.

Weniger “toughe” Geister werden noch eine Zeile einfügen, bei denen Crontab in etwa fünf Minuten etwas zu tun bekommt – doch sollte man sich hier kein Bein stellen: Tragen Sie die echten Adressat(inn)en erst dann in adventskal ein, wenn dieser Testlauf tatsächlich glückte. Wer will schon, dass am …

5 19 20 11 * $HOME/bin/adventskal

… 20. November um 19.05 Uhr die ganze Überaschung geplatzt ist?

Glossar

CGI

“Common Gateway Interface”, eine Schnittstelle zwischen einem Webserver und Programmen, die jener aufruft, um zusätzliche, in der Regel dynamisch generierte Funktionalität in Webseiten zur Verfügung zu stellen. Die weitaus meisten dieser Programme werden in einer Skriptsprache wie Perl geschrieben und daher CGI-Skripte genannt.

MIME

“Multipart Internet Mail Extensions”, der Standard, der definiert, wie man Nicht-7-Bit-ASCII- und mehrere Dateien gleichzeitig via Mail transportiert. Ursprünglich war der Internetdienst E-Mail lediglich darauf zugeschnitten, Textnachrichten zu übermitteln, die aus den Zeichen bestanden, die man auf einer amerikanischen Tastatur erzeugen kann. Das ist auch heute noch der Fall (wenn auch die meisten Mailserver mit 8-Bit-ASCII umgehen und daher z.B. Textnachrichten mit “echten” deutschen Umlauten richtig übertragen können). Daher muss man Dateien, die in einem binären Format vorliegen (kompilierte Programme oder gepackter Quellcode, diverse Grafik- und Audioformate, häufig auch von Officepaketen generierte Dateien etc.), vor dem Abschicken in ein 7-Bit-ASCII-Transportformat wandeln. Das übernimmt das Mailprogramm, der “Mail User Agent” (MUA). Er sorgt auch dafür, dass verschiedene Attachments, die in einer E-Mail transportiert werden, durch sogenannte MIME-Header voneinander abgetrennt werden. Der Empfänger-MUA liest aus diesen MIME-Headern, welche Transportkodierung verwendet wurde und um welchen Dateityp (daher der Begriff MIME-Typ(e)) es sich handelt, und wandelt das Attachment in das Originalformat, wenn die Empfängerin es sich anzeigen lässt oder es extern abspeichern will.

ASCII-Art

Vollständig aus ASCII-Textzeichen (Buchstaben, Ziffern und den übrigen Zeichen auf einer (amerikanischen) Tastatur) aufgebaute Grafik; siehe z.B. http://www.stud.uni-hannover.de/~freise/ascii/faq.html.

URL

“Uniform Resource Locator”, die eindeutige Adresse einer Ressource im Netz. So bezeichnet z.B. ftp://www.linux-mandrake.com/pub/ das Verzeichnis pub im Daten-Bereich des FTP-Servers, der auf dem Rechner www.linux-mandrake.com läuft, während http://www.linux-mandrake.com/bugs/Reporting.html die Datei Reporting.html im Webdatenverzeichnis bugs meint, die vom ebenfalls auf www.linux-mandrake.com laufenden Web-(HTTP-)Server bereit gestellt wird.

Tabulatortaste

Die TAB-Taste ist nahezu der wichtigste Key für tippfaule Bash-Nutzer/innen. Einmal auf der Kommandozeile betätigt, versucht die Bash, die bisher eingegebenen Nicht-Leerzeichen sinnvoll zu einem Kommando oder einem Dateinamen zu erweitern (“expandieren”). Gibt es zu viele Möglichkeiten, passiert nichts, und man kann mit einem zweiten TAB alle zur Auswahl stehenden Ergänzungsmöglichkeiten betrachten. Hat man sich für eine entschieden, gibt man ein oder mehrere Zeichen ein, die die Auswahl eindeutiger erscheinen lassen. Kann durch einen weiteren Druck auf TAB immer noch keine eindeutige Expansion vorgenommen werden, geht das Spiel von vorn los.

Bash

Die “Bourne again shell” wird von fast allen Linux-Distributoren als Standardkommandozeilenschnittstelle zwischen Benutzer/in und Betriebssystemkern eingesetzt und zeichnet sich durch eine Menge arbeitserleichternder Funktionen und eine eingebaute Programmiersprache aus – allerdings will deren Bedienung auch erst erlernt sein…

Mailbody

Eine E-Mail besteht immer aus zwei Teilen: dem Mailheader mit Verwaltungsinformationen wie Absender-(From-) und Empfänger-(To-)Adresse, Betreff (Subject) etc. und dem eigentlichen Mailinhalt, dem Body. Besteht dieser aus verschiedenen Attachments, so hat jedes wiederum seine eigenen MIME-Header zur Inhalts- und Kodierungsbeschreibung.

echo

Dieser Befehl tut nichts anderes als sein Name besagt: das ausgeben, was ihm an Argumenten mitgegeben wird. Verlangt ein $, dass der Inhalt der nachfolgenden Variable gewünscht wird, so hält sich echo an diese Vorgabe, sofern man dem Dollarzeichen keine Escapezeichen wie \ voran stellt (echo $HOME vs. z.B. echo \$HOME).

cd

(“change directory”) wechselt in das als Argument angegebene Verzeichnis, ohne Argument ins Homeverzeichnis.

ls

(“list”) listet ohne weitere Argumente den Inhalt des aktuellen Arbeitsverzeichnisses auf. Wenn man dahinter ein Argument schreibt, passt sich ls dem Dateityp dieses Arguments an: Handelt es sich um ein Verzeichnis, wird dessen Inhalt angezeigt, ist es dagegen eine einfache Datei, gibt ls ihren Namen aus.

*

Jokerzeichen, das in der Shell für eine beliebige Anzahl (auch null) beliebiger Zeichen steht.

\

Möchte man einen leicht länglichen Befehl übersichtlicher aufschreiben, so kann man ihn über mehrere Zeilen verteilen, wenn man der Shell sagt, dass die Zeilenumbrüche ausnahmsweise mal nicht das Befehlsende bedeuten. Dazu schreibt man als allerletztes Zeichen vor dem Betätigen der Return-Taste ein \ und setzt die Kommandozeile auf der nächsten Zeile fort.

LinuxUser 12/2000 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben