Bash-Skript zum Checken von Netzwerkfunktionen und anschließendem Mail-Versand

Raubsau

NGBler
Registriert
29 Aug. 2013
Beiträge
197
Hallo,

da ich programmiertechnisch ein Laie bin, benötige ich Eure Hilfe.

Ich brauche ein Skript, das folgendes macht:

1. Ping 192.168.0.1 (also Router anpingen). Falls Fehlschlag: Ende, dann wird kein Mailversand möglich sein. Logeintrag mit Zeitstempel.
2. Ping google. Falls Fehlschlag: Ende, dann wird kein Mailversand möglich sein. Logeintrag mit Zeitstempel.
3. Ping hostname.local/IP. Falls erfolgreich: Logeintrag mit Zeitstempel.
4. Falls 1. und 2. geht, aber 3. nicht (also der Rechner "hostname" nicht pingbar ist) soll eine Mail mit Zeitstempel versandt werden (über SMTP, am besten mit Verschlüsselung).

Das ganze soll unter Ubuntu laufen und am besten alle 15 min gestartet werden (cron?). Falls eine Mail versandt wurde, sollen keine weiteren Mails folgen, bis ich einen "Reset" des Skripts durchgeführt habe.

Soll also ein kleiner Netzwerkmonitor sein. Sowas wie Nagios ist Overkill, da ich nur einen Rechner überwachen will.

Kann mir das jemand schreiben?

Danke,

Raubsau
 
Als möglicher Ansatz:
[src=bash]#!/bin/bash

LOGFILE='/var/log/netwatchdog.log'
LOCKFILE='/var/lock/netwatchdog_fail.lock'

if ! ping -t1 -c1 192.168.0.1 > /dev/null; then
echo "[`date +'%Y-%m-%d %H:%M:%S'`] Router-Ping fehlgeschlagen! Abbruch." >> $LOGFILE
exit 0
fi

if ! ping -t1 -c1 8.8.8.8 > /dev/null; then
echo "[`date +'%Y-%m-%d %H:%M:%S'`] Google-DNS-Ping fehlgeschlagen! Abbruch." >> $LOGFILE
exit 0
fi

if ping -t1 -c1 192.168.0.42 > /dev/null; then
# Ping erfolgreich - Skript beenden.
exit 0
fi

# Wenn bis hier ausgefuehrt: Router/Google OK, Zielserver FAIL
echo "[`date +'%Y-%m-%d %H:%M:%S'`] Ueberwachter Server ist DOWN!" >> $LOGFILE

if [ -f "$LOCKFILE" ]; then
# lockfile existiert - Kein Mailversand bis manuell entfernt
exit 0
fi

ssmtp empfaenger@example.com <<EOF
From: sender@example.com
To: empfaenger@example.com
Subject: Ueberwachter Server offline

Die automatische Ueberpruefung des Servers um `date +'%Y-%m-%d %H:%M:%S'` ist fehlgeschlagen.
Es wird keine weiteren Nachrichten mehr geben, bis das Lockfile $LOCKFILE manuell entfernt wird.

Gruss,
Watchdog
EOF

if [ $? == 0 ]; then
# lockfile erstellen
touch "$LOCKFILE"

echo "[`date +'%Y-%m-%d %H:%M:%S'`] E-Mail-Benachrichtigung verschickt. Lockfile erstellt." >> $LOGFILE
else
echo "[`date +'%Y-%m-%d %H:%M:%S'`] Fehler beim E-Mail-Versand!" >> $LOGFILE
fi[/src]

Zum E-Mail-Versand wird (da ich davon ausgehe, dass kein lokales E-Mail-Setup vorhanden ist, welches erlauben würde, E-Mails über mail/sendmail zu verschicken) ssmtp genutzt. Dieses muss aus den Paketquellen installiert und über /etc/ssmtp/ssmtp.conf konfiguriert werden, um E-Mails über einen entfernten SMTP-Server zu verschicken. Ausserdem müssen im Skript natürlich die Server-IP-Adressen und die E-Mail-Adressen angepasst werden.

Das Skript kann über einen crontab-Eintrag regelmässig gestartet werden. Der ausführende Benutzer benötigt Leserechte für /etc/ssmtp/ssmtp.conf sowie Schreibrechte für die beiden in LOGFILE und LOCKFILE angegebenen Dateien.
 
Ich verstehe nicht, wieso du das supportest. Es ist zwar nett, aber ich verstehe nicht, warum du dir die Zeit nimmst das zu copy&pasten (ich gehe davon aus, dass du selbst zumindest ein ähnliches Shellscript rumliegen hast), wenn der TS sich nicht die gleiche Zeit nehmen will, um bei google nachzuschauen.
Zwischen "raussuchen und copy&paste" und "bei google suchen und selbst schreiben" besteht zeitlich kaum ein Unterschied.

Wäre ein solches Script derart komplex, dass man es nicht ohne Jahre der Erfahrung schreiben könnte, könnte ich es ja noch verstehen, aber bei so einem trivialen Script muss ich dem TS Faulheit unterstellen.
 
In der Tat hatte ich bereits ein ähnliches Skript, allerdings unter stärkerer Verwendung der cron-Infrastruktur, d.h. mit sinnvolleren Exit-Codes und ohne externes Log oder ssmtp zum Versenden von E-Mails (cron sendet standardmässig ohnehin E-Mails für fehlgeschlagene jobs, dazu muss allerdings ein lokaler MTA eingerichtet sein, welcher E-Mails entweder direkt verschickt oder an einen Smarthost übergibt).
Der Aufwand, es entsprechend anzupassen und einige Zeilen Kommentare einzufügen, war für mich sehr gering - daher sehe ich keinen Grund, es Raubsau vorzuenthalten. Wenn er bis anhin noch nie bash-Skripts geschrieben hat, würde er sicherlich wesentlich länger benötigen, und dabei u.U. sogar Schwachstellen aufreissen. Mit dem geposteten Skripts hat er nun zumindest einen Ansatz.
 
  • Thread Starter Thread Starter
  • #6
Das ist für mich nicht trivial, sondern absolut unbekannt. Ich kann nicht mal JavaScript.


Super, allerbesten Dank! Ich habe das Skript angepasst und es läuft; mit cron muss ich mich noch beschäftigen. Das bekomme ich vermutlich allein hin (ubuntuusers.de).


Ich habe direkt nach vollständiger Hilfe gefragt und sie bekommen - ich sehe hier keine Faulheit, sondern Effizienz. Ohne Kugelfisch hätte ich Stunden mit Trial & Error zugebracht. Diese Zeit konnte ich anders nutzen und habe mich sehr darüber gefreut :)
 
  • Thread Starter Thread Starter
  • #7
Ich bekomme es doch nicht hin:

Beim Ausführen in der Bahs bekomme ich eine Fehlermeldung, dass das in Zeile 29 gestartete <<EOF bis zum Ende geht und eigentlich ein EOF erwartet wird.
Dabei ist doch ein Zeile 39 eins vorhanden!?
Ich bekomme eine leere E-Mail geschickt und das Lockfile wird nicht erstellt.
Woran soll das nun wieder liegen? Das EOF ist auf jeden Fall vorhanden, ich habe es noch einmal händisch eingetragen, ohne Leerzeichen oder Tab.

edit://
Gelöst! Hinter der From: Zeile muss eine leere Zeile folgen, sonst wird kein Body angehängt. Zeile 33 ist hier also notwendig.

Außerdem:
muss die Option ping -t1 so angepasst werden, dass realistische Werte benutzt werden. 15 oder 20 sind für den Google-Ping zu empfehlen, für den Routerping sollte 1 reichen, für den Ping zum eigentlichen Ziel vielleicht 2 oder 5.
 
Zuletzt bearbeitet:
Zurück
Oben