Server ruft per Mail um Hilfe
Willemers Informatik-Ecke

Wenn die Protokolle nicht regelmäßig durchgesehen werden, kann es passieren, dass ein Serverproblem erst dann bemerkt wird, wenn alles zu spät ist. Insbesondere, wenn eine Datensicherung nicht funktioniert, sollte irgendjemand informiert werden.

Die ideale Lösung ist es, eine Mail zu versenden. Die muss dann aus dem Sicherungsskript angestoßen werden. Dazu gibt es grundlegend unterschiedliche Konzepte.

Nutzung des eingebauten Mailservers

Auf einem Linux-Server ist im Normalfall immer ein Mail-Server installiert. Er sorgt dafür, dass zwischen den registrierten Benutzern Mails ausgetauscht werden können. Das war rudimentär zu den Zeiten, als UNIX-Maschinen von mehreren Benutzern gleichzeitig genutzt wurden. Diese Nutzer können auch die Service-Betreiber der verschiedenen Server sein.

Allerdings hilft es bei Servern in der Regel wenig, wenn die Nachrichten innerhalb des Servers verteilt werden. Wir benötigen eine Erweiterung des Mail-Servers um das Senden an einen Internet-Mail-Server und ein Programm, mit dem wir aus dem Skript heraus eine Mail versenden können.

mail und postfix

Für das Versenden einer Mail wird der Befehl mail aufgerufen. Dieser ist das direkte Frontend zu dem installierten SMTP-Server, der auf dem lokalen System installiert ist. Die bekannteste Variante davon ist Postfix.

Der Befehl mail ist auf den meisten Linux-Systemen nicht mehr standardmäßig vorhanden, steht aber nach der Installation des Pakets mailutils zur Verfügung, muss also installiert werden.

apt install mailutils

Postfix

Nicht auf jedem Linux-System ist ein Postfix als Mail-Server installiert. So beispielsweise auf einem Debian-Server. Dann benötigt man folgenden Befehl:
apt install -y postfix
Im Laufe der Installation wird angefragt, welcher Servertyp benötigt wird. Hier wählt man die folgenden Optionen:

Postfix-Konfiguration

Die Konfigurationsdateien von Postfix befinden sich im Verzeichnis /etc/postfix. Die wichtigste davon ist main.cf.
cd /etc/postfix
vi main.cf

Benennen des Relay-Hosts

Dort wird die Verbindung zum Relay-Host geschlagen. Das ist der Internet-Server, den wir benutzen, um die Mail in die weite Welt oder wenigstens bis zum Administrator zu senden. Im Beispiel wird eine GMX-Adresse verwendet. Es funktioniert aber auch mit allen anderen Diensten.

myhostname = gitlab.inf.fh-flensburg.de
...
mydestination =
relayhost = mail.gmx.net:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_password
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
sender_canonical_maps = hash:/etc/postfix/sender_canonical

Zuordnen der Benutzer zu externen Mail-Adressen

Auf dem Server können verschiedene Nutzer angemeldet sein. Ihnen muss zugeordnet werden, wer welche E-Mail-Adresse für den Kontakt nach außen verwendet. Das konfiguriert die Datei sender_canonical. Sie befindet sich im Verzeichnis /etc/postfix und kann mit einem beliebigen Editor bearbeitet werden. Ich verwende vi, andere mögen nano vielleicht lieber.

vi /etc/postfix/sender_canonical
Hier werden die Zuordnungen der lokalen Nutzer zu den E-Mail-Adressen eingetragen. Das Beispiel zeigt die Nutzer gast, arnold und root. In diesem Fall wird für alle Benutzer die gleiche Mail-Adresse verwendet. Das muss aber nicht zwingend so sein.

gast arnold-willemer@gmx.de
arnold arnold-willemer@gmx.de
root arnold-willemer@gmx.de
Anschließend muss die Konfiguration bei Postfix angemeldet werden. Dazu diesen folgende Befehle:
postmap sender_canonical
postfix reload
Für die Adresse arnold-willemer@gmx.de muss das Passwort in der Datei /etc/postfix/sasl_password hinterlegt sein.
mail.gmx.net arnold-willemer@gmx.de:meinpasswort
Das erste ist der Servername, der unter relayhost in der Datei main.cf steht. Das zweite ist die Mail-Adresse, die in sender_canonical steht. Hinter dem Doppelpunkt steht das Passwort des SMTP-Zugangs für das GMX-Postfach.

Auch diese Datei muss mit postmap in eine db-Datei gewandelt werden. Und auch hier muss dem Postfix mitgeteilt werden, dass sich die Konfiguration geändert hat.

postmap sasl_password
postfix reload

Das Absetzen der Mail

Der Befehl mail kann von der Konsole aufgerufen werden. Wird er ohne weitere Optionen aufgerufen, zeigt er die eingetroffenen Mails des Users.

Für das Senden wird die Zieladresse als Argument verwendet. So können Benutzer des eigenen Systems untereinander Mails austauschen. Wirklich interessant aber wird es, wenn man als Argument eine Zieladresse im Internet angibt. Dann leitet der lokal installierte Mailserver die Mail an die Zieladresse. Das geschieht im Dialog mit mehreren Zeilen.

$ mail huidibui@mail.de
Cc: 
Subject: Toller Betreff
Alles wird gut, glaube mir!
.

Die letzte Zeile wird durch einen einfachen Punkt markiert.

Das Versenden aus einem Skript ist im Dialog nicht möglich. Hier müssen alle Bestandteile in einen Aufruf gepackt werden.

mail -s "Betreff der Mail" arnold-willemer@gmx.de < inhalt.txt
Das folgende Skript versucht innerhalb einer Datensicherung eine NAS einzuhängen. Sollte das nicht gelingen, weil beispielsweise die NAS nicht erreichbar ist, sollte eine Mail versendet werden. Der Text wurde in einer Datei fehlermeldung.txt hinterlegt.

mount -t nfs NAS04:/volume2/dasi /mnt 2>>err
if ! test -d /mnt/backup
then
   mail -s "Fehler: NAS mount" arnold-willemer@gmx.de < fehlermeldung.txt
   exit
fi

sendemail sendet an SMTP-Server

Anstatt den Mail-Server des Systems zu nutzen, kann man mit dem Programm sendemail direkt auf einen SMTP-Server seines Providers senden. Der Charme dieser Lösung liegt darin, dass keine Konfiguration erforderlich ist.

Installation

Das Programm gehört zum Standard-Umfang eines Repositories und kann mit dem folgenden Befehl installiert werden:

sudo apt install sendemail

Aufruf

Mit dem folgenden Aufruf kann eine Mail versandt werden.

sendemail -f ich@provider.de -t arnold-willemer@gmx.de \
 -u "Fehler: NAS mount" -m "Bitte nachsehen" \
 -s smtp.provider.de:587 -xu ich@provider.de -xp geheim
Die Optionen haben folgende Bedeutung:

Unbefriedigend ist, dass das Passwort im Klartext in den Skript geschrieben werden muss.

mutt sendet an SMTP-Server

Mutt ist ein Terminal-Mail-Client, der auch von der Konsole aufgerufen werden kann.

Installation

Mutt in jedem Linux-Repository vorhanden. Der folgende Befehl installiert mutt.
sudo apt install mutt

Aufruf

Die zu sendende Nachricht wird Mutt über eine Pipe übergeben. Mit -s wird der Betreff übergeben und hinter dem doppelten Minuszeichen steht der Empfänger.
echo "Nachricht" | mutt -s "Subject" -- arnold@willemer.de
Damit das so wundervoll klappt, muss allerdings eine Konfiguration vorbereitet werden. Diese befindet sich im Home-Directory in der Datei .muttrc.
set from = "arnold.willemer@gmx.de"
set smtp_url = "smtp://arnold.willemer@gmx.de@mail.gmx.net:587/"
set smtp_pass = "furchtbargeheim"
set ssl_starttls = yes
set editor = "vim"
Die Datei sollte man nur für den Besitzer lesbar machen. So ist das Passwort im Klartext wenigstens nicht für jedermann lesbar.
chmod 600 ~/.muttrc

Voraussetzung SMTP

Damit mutt senden kann, muss irgendein SMTP-Server auf dem System installiert sein. Sollte es beim Senden einen Fehler 127 geben, ist es am einfachsten, das Paket sendmail zu installieren.
sudo apt install sendmail