![]() |
|
Linux - Wegweiser für NetzwerkerOnline-VersionCopyright © 2001
by O'Reilly Verlag GmbH & Co.KG Bitte denken Sie daran: Sie dürfen zwar die Online-Version ausdrucken, aber diesen Druck nicht fotokopieren oder verkaufen. Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen. Wünschen Sie mehr Informationen zu der gedruckten Version des Buches Linux - Wegweiser für Netzwerker oder wollen Sie es bestellen, dann klicken Sie bitte hier. |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Das wohl mächtigste Feature von sendmail sind die Rewrite-Regeln. Solche Regeln werden von sendmail benutzt, um zu entscheiden, wie eine empfangene Mail verarbeitet werden soll. sendmail läßt die Adressen der Header einer E-Mail einen Satz von Rewrite-Regeln durchlaufen, die als Regelsätze (rulesets) bezeichnet werden. Die Rewrite-Regeln wandeln eine Mail-Adresse von einer Form in eine andere um. Stellen Sie sich das so vor, als hätten Sie in Ihrem Editor einen Befehl, mit dem Sie alle Textabschnitte, die zu einem bestimmten Suchmuster passen, durch einen anderen Text ersetzen.
Jede Regel besteht aus einem linksseitigen (lhs=left hand side) und einem rechtsseitigen (rhs=right hand side) Teil, getrennt durch ein oder mehrere TAB-Zeichen. Wenn sendmail eine Mail verarbeitet, durchsucht es alle Rewrite-Regeln nach einem passenden linksseitigen Teil. Falls die Adresse zu einem dieser Teile paßt, wird sie durch den rechtsseitigen Teil ersetzt und anschließend weiterverarbeitet.
In der sendmail.cf-Datei werden die Regelsätze mit Befehlen im Format S
n
definiert. Dabei bezeichnet n
der Regelsatz, der als der aktuelle aufgefaßt wird.
Die Regeln selbst erscheinen in Anweisungen der Form R. Jede eingelesene R-Anweisung erweitert den aktuellen Regelsatz.
Wenn Sie es nur mit der sendmail.mc-Datei zu tun haben, brauchen Sie sich über die S-Befehle nicht den Kopf zu zerbrechen – die Makros erzeugen sie für Sie. Sie müssen (meist) nur die R-Regeln im Rahmen der mc-Dateien manuell codieren.
Ein sendmail-Regelsatz hat also folgendes Format:
S
n
R
lhs
rhs
R
lhs2
rhs2
sendmail verwendet intern eine Reihe von Standard-Makrodefinitionen. Davon sind folgende zum Schreiben der Regelsätze am nützlichsten:
Der voll qualifizierte Domainname (FQDN) dieses Hostrechners.
Die Hostnamen-Komponente des FQDN.
Die Domainnamen-Komponente des FQDN.
Diese Makrodefinitionen können wir in unsere Rewrite-Regeln einbinden. Die Konfiguration unserer virtuellen Brauerei benutzt das Makro $m
.
Im linksseitigen Teil einer Rewrite-Regel geben Sie ein Muster an, das auf eine Adresse paßt, die Sie transformieren wollen. Die meisten Zeichen werden direkt überprüft, es gibt aber eine Reihe von Zeichen mit besonderer Bedeutung; sie werden in der nachfolgenden Liste beschrieben. Die Rewrite-Regeln für den linksseitigen Teil sind:
$@
Prüft auf exakt null Tokens.
$*
Prüft auf null oder mehr Tokens.
$+
Prüft auf ein oder mehrere Tokens.
$-
Prüft auf genau ein Token.
$=
x
Prüft auf irgendeinen Satz in Klasse x
.
$~
x
Prüft auf irgendein Wort, das nicht in Klasse x
enthalten ist.
Ein Token ist eine durch Leerzeichen begrenzte Zeichenfolge. Leerzeichen können daher nicht Bestandteil eines Tokens sein. Das ist auch gar nicht notwendig, da die Suchmuster flexibel genug sind, um diesem Bedarf gerecht zu werden. Wenn eine Regel eine Adresse überprüft, wird jeder Textabschnitt, der zu einem der Suchmuster im Ausdruck paßt, einer speziellen Variablen zugewiesen, die wir dann im rechtsseitigen Teil der Regel benutzen. Die einzige Ausnahme bildet $@
, das auf keine Tokens prüft und daher auch keinen Text produziert, der im rechtsseitigen Teil verwendet werden könnte.
Wenn der linksseitige Teil einer Rewrite-Regel zu einer Adresse paßt, wird der Ausgangstext komplett gelöscht und durch den rechtsseitigen Teil der Regel ersetzt. Alle Tokens im rechtsseitigen Teil werden buchstabengetreu kopiert, solange sie nicht mit einem Dollarzeichen beginnen. Wie im linksseitigen Teil kann auch im rechtsseitigen Teil eine Reihe von Metasymbolen benutzt werden. Sie werden in der folgenden Liste beschrieben. Die Rewrite-Regeln für den rechtsseitigen Teil sind:
$
n
Dieses Metasymbol wird durch den n
-ten Ausdruck des linksseitigen Teils ersetzt.
$[
name
$]
Dieses Metasymbol bildet Hostnamen in kanonische Namen ab. Es wird durch die kanonische Form des angegebenen Hostnamens ersetzt.
$(
map key
$@
arguments
$:
default
$)
Dies ist die allgemeinere Form der Mustersuche. Ausgegeben wird das Resultat der Suche von key
in der Map namens map, wobei die arguments
als Argumente übergeben werden. map bezeichnet eine der von sendmail unterstützten Maps, beispielsweise virtusertable
, die wir in Kürze beschreiben werden. Schlägt die Suche fehl, wird default
ausgegeben. Ist keine Vorgabe angegeben und die Suche schlägt fehl, bleibt die Eingabe unverändert, und key
wird ausgegeben.
$>
n
Bewirkt, daß der Rest dieser Zeile analysiert und dann zur Auswertung an Regelsatz n
übergeben wird. Die Ausgabe des aufgerufenen Regelsatzes wird an diese Regel weitergegeben. Mit diesem Verfahren können Regeln andere Regelsätze aufrufen.
$#
mailer
Dieses Metasymbol beendet die Auswertung der Regelsätze und gibt den Mailer an, der diese Nachricht im nächsten Schritt seiner Zustellung transportieren soll. Es sollte nur von Regelsatz 0 oder von einer ihrer Subroutinen aufgerufen werden. Das ist die letzte Stufe der Adressenanalyse, die von den nächsten beiden Metasymbolen begleitet werden sollte.
$@
host
Dieses Metasymbol gibt den Host an, an den diese Nachricht weitergeleitet werden soll, und kann entfallen, wenn es sich dabei um den lokalen Host handelt. host
kann auch eine mit Doppelpunkten getrennte Liste von Zielhosts sein, die für die Nachrichtenzustellung der Reihe nach durchprobiert werden sollen.
$:
user
Dieses Metasymbol gibt den Empfänger der Mail an.
Eine passende Rewrite-Regel wird normalerweise immer wieder durchprobiert, bis sie schließlich fehlschlägt. Danach wird die Analyse mit der nächsten Regel fortgesetzt. Dieses Verhalten kann geändert werden, indem dem rechtsseitigen Teil eines von zwei speziellen Metasymbolen vorangestellt wird, die in der folgenden Liste beschrieben werden. Die Metasymbole für Rewrite-Regeln für eine rechtsseitige Schleifenstruktur sind:
$@
Dieses Metasymbol führt dazu, daß der Regelsatz den Rest des rechtsseitigen Teils als Resultat zurückliefert. Es werden keine weiteren Regeln des Regelsatzes ausgewertet.
$:
Dieses Metasymbol führt zur sofortigen Beendigung dieser Regel. Der Rest des aktuellen Regelsatzes wird aber noch ausgewertet.
Um besser zu verstehen, wie die Suchmuster für Makroersetzungen funktionieren, betrachten wir den folgenden linksseitigen Teil:
$* < $+ >
Diese Regel prüft auf “null oder mehr Tokens, gefolgt vom Zeichen <, gefolgt von einem oder mehreren Tokens, gefolgt vom Zeichen >”.
Würde diese Regel auf brewer@vbrew.com
oder Head Brewer < >
angewendet, würde sie nicht passen. Der erste String paßt nicht, da er kein <-Zeichen enthält, der zweite ebenfalls nicht, da $+
auf ein oder mehrere Tokens prüft und keine Tokens zwischen den <>
-Zeichen zu finden sind. In allen Fällen, in denen eine Regel nicht paßt, wird der rechtsseitige Teil der Regel nicht verwendet.
Würde man die Regel hingegen auf Head Brewer < brewer@vbrew.com >
anwenden, würde sie passen. Im rechtsseitigen Teil würde dann $1
durch Head Brewer
und $2
durch brewer@vbrew.com
ersetzt werden.
Für < brewer@vbrew.com >
würde die Regel auch passen, da $*
auf null oder mehrere Tokens prüft. Im rechtsseitigen Teil der Regel würde $1
durch einen leeren String ersetzt werden.
Jede der sendmail-Regelsätze wird aufgerufen, um eine bestimmte Aufgabe in der Mail-Verarbeitung zu erledigen. Wenn Sie selbst Regeln formulieren, ist es wichtig zu verstehen, was jeder Regelsatz eigentlich tut. Wir betrachten nun die Regelsätze, die wir gemäß den m4-Konfigurationsskripten modifizieren dürfen:
Regelsatz 3 ist verantwortlich für die Konvertierung einer Adresse beliebigen Formats in ein allgemeines Format, das von sendmail weiterverarbeitet wird. Das erwartete Ausgabeformat ist das vertraute local-part
@
host-domain-spec
.
Regelsatz 3 sollte den Hostnamen-Teil der konvertierten Adresse in <
und >
einklammern, um es den nachfolgenden Regelsätze leichter zu machen. Regelsatz 3 kommt bereits zum Zuge, bevor sendmail eine E-Mail-Adresse überhaupt bearbeitet. Wenn Sie also mit sendmail Mails von einem System übertragen wollen, das ein unübliches Adressenformat verwendet, sollten Sie eine Regel hinzufügen, die das LOCAL_RULE_3
-Makro zur Konvertierung von Adressen in das allgemeine Format verwendet.
Nach dem Regelsatz 3 wendet sendmail Regelsatz 0 auf die Empfängeradressen an. Das Makro LOCAL_NET_CONFIG
bewirkt, daß Regeln in die untere Hälfte des Regelsatzes 0 eingefügt werden.
Von Regelsatz 0 wird erwartet, daß er die Zustellung der Nachricht an den Empfänger vornimmt. Die Nachricht muß daher in ein Tripel aufgelöst werden, bestehend aus Mailer, Host und Benutzer. Die Regeln werden vor etwaigen Smart-Host-Definitionen plaziert. Wenn Sie also Regeln hinzufügen, die Adressen angemessen auflösen, werden alle Adressen, die zu einer dieser Regeln passen, vom Smart Host nicht weiter behandelt. Das ist genau die Art und Weise, wie wir das direkte smtp für die Benutzer unseres lokalen LANs in unserem Beispiel handhaben.
Regelsatz 1 wird auf alle Senderadressen angewendet, Regelsatz 2 dagegen auf alle Empfängeradressen. Beide sind für gewöhnlich leer.
Unser Beispiel in Tabelle 18.3 benutzt das Makro LOCAL_NET_CONFIG
. Es deklariert eine lokale Regel, die sicherstellt, daß jede Mail in unserer Domain direkt durch den smtp-Mailer ausgeliefert wird.Nachdem wir nun wissen, wie Rewrite-Regeln konstruiert werden, können wir verstehen, wie diese Regel funktioniert. Werfen wir noch einen Blick darauf.
Beispiel 18.3: Rewrite-Regeln von vstout.uucpsmtp.m4
LOCAL_NET_CONFIG # Diese Regel stellt sicher, daß alle lokalen Mails über den smtp-Transport # ausgeliefert werden. Alles andere läuft über den Smart Host. R$* < @ $* .$m. > $* $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3
Wir wissen, daß das LOCAL_NET_CONFIG
-Makro bewirkt, daß die Regel irgendwo ans Ende von Regelsatz 0 gesetzt wird, aber immer vor die erste Smart-Host-Definition. Außerdem wissen wir, daß der Regelsatz 0 der zuletzt auszuführende Regelsatz ist und ein Tripel aus Mailer, Host und Benutzer zurückliefern sollte.
Die drei Kommentarzeilen können wir getrost ignorieren; sie tun nichts wirklich Nützliches. Die Regel selbst ist die Zeile mit dem R
am Anfang. Wir wissen, daß R
ein sendmail-Befehl ist und daß er diese Regel zum aktuellen Regelsatz hinzufügt, in diesem Fall zum Regelsatz 0
. Sehen wir uns nun abwechselnd die links- und rechtsseitigen Teile an.
Der linksseitige Teil sieht so aus: $* < @ $* .$m. > $*
.
Regelsatz 0 erwartet die Zeichen < und >, da sie Eingaben von Regelsatz 3 erhält. Regelsatz 3 konvertiert Adressen in ein allgemeines Format, um das Parsing einfacher zu machen. Außerdem setzt sie den Hostteil der Mail-Adresse in <>.
Diese Regel verarbeitet alle Mail-Adressen der Form 'Benutzer < @ IrgendeinHost.UnsereDomain. > Irgendein Text'
. Das heißt, sie prüft Mails für beliebige Benutzer auf beliebigen Hosts unserer Domain.
Sie erinnern sich, daß Text, der zu Metasymbolen im linksseitigen Teil einer Rewrite-Regel paßt, Makrodefinitionen zugewiesen wird, die im rechtsseitigen Teil verwendet werden. In unserem Beispiel paßt das erste $*
zum Textabschnitt vom Anfang der Adresse bis zum <-Zeichen. Dieser Bereich wird $1
zugewiesen und kann dann im rechtsseitigen Teil benutzt werden. Dementsprechend wird das zweite $*
in unserer Rewrite-Regel an $2
zugewiesen und das letzte an $3
.
Nun haben wir genug gesehen, um den linksseitigen Teil zu verstehen. Diese Regel prüft auf Mails für beliebige Benutzer auf beliebigen Hosts innerhalb unserer Domain. Den Benutzernamen weist sie an $1
zu, den Hostnamen an $2
und den Rest an $3
. Danach wird der rechtsseitige Teil der Regel aufgerufen, um diese Makros zu verarbeiten.
Sehen wir uns nun an, was als Ausgabe erscheinen sollte. Der rechtsseitige Teil unserer Rewrite-Regel sieht folgendermaßen aus:
$#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3
.
Wird der rechtsseitige Teil unserer Regel verarbeitet, werden alle Metasymbole interpretiert und die relevanten Substitutionen vorgenommen.
Das Metasymbol $#
bewirkt, daß diese Regel zu einem spezifischen Mailer resolviert, in unserem Fall smtp.
Das Symbol $@
resolviert den Zielhost. In unserem Beispiel ist $2.$m.
als Zielhost angegeben, was dem voll qualifizierten Namen (FQDN) des Hostrechners in unserer Domain entspricht. Konstruiert wird dieser Name aus der Hostnamen-Komponente, die an $2
vom linksseitigen Teil zugewiesen wird, ergänzt um unseren Domainnamen (.$m.
).
Das Metasymbol $:
spezifiziert den Zielbenutzer, den wir wiederum im linksseitigen Teil erfaßt und in $1
abgespeichert hatten.
Den Inhalt des <>-Abschnitts sowie den Rest übernehmen wir unverändert. Dazu greifen wir auf die im linksseitigen Teil gesammelten Daten zurück.
Da diese Regel zu einem Mailer resolviert, wird die Nachricht zu dem Mailer weitergeleitet, der die Zustellung übernimmt. In unserem Beispiel würde die Nachricht mittels SMTP an den Zielhost weitergeleitet.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Weitere Informationen zum Linux - Wegweiser für Netzwerker
Weitere Online-Bücher & Probekapitel finden Sie in unserem Online Book Center
© 2001, O'Reilly Verlag