ubuntuusers.de

Bashscript zur Netzwerküberwachung

Status: Ungelöst | Ubuntu-Version: Server 15.10 (Wily Werewolf)
Antworten |

Iv0ry

Anmeldungsdatum:
1. Oktober 2010

Beiträge: Zähle...

Hi Leute, ich versuche mich Grade an einem Shellscript, was die Erreichbarkeit der Clientrechner per Ping überwachen soll und im Fehlerfall (nicht per Ping erreichbar) mir eine E-Mail an meine @gmx.de Adresse senden soll. Leider ist meine Shellscript Kenntnisse sehr überschaubar und erhoffe mir bei Euch Hilfe. 🙄

Das Shellscript soll alle 15 Minuten die IP-Adressen anpingen und das Ergebnis in eine Textdatei (untereinander) schreiben ( 0 = nicht erreichbar 1 = erreichbar), die ich später auch in einem PHP-Script weiter grafisch Ausgebe (die Ausgabe in PHP habe ich bereits fertig). Mir fehlt nun die Möglichkeit die Textdatei mir den Ping Ergebnissen zu füllen. In PHP wollte ich dies nicht machen, da es recht viel Zeit in Anspruch nimmt, die Adressen anzupingen, daher der "Umweg" über ein Shellscript (geteilte Arbeit = weniger Ladezeit der Seite). Die Textdatei soll dann folgendermaßen aussehen:

1
1
1
1
1
...etc

→ Im Idealfall alle Hosts per Piug erreichbar (in diesem Beispiel). 😉

Darüber hinaus soll wenn ein Host eben nicht erreichbar ist, mir eine E-Mail an mich (@gmx.de) Adresse versendet werden. Ein lokaler Mailserver läuft aber auf dem Linuxserver nicht. Was ich bisher habe, aber leider nicht funktioniert (daher wollte ich zunächst bei euch Hilfe einholen):

Im Beispiel habe ich 8 IP-Adressen genommen. In der Realität sind es knapp 30 (nicht hintereinander es gibt auch freie Adressen dazwischen).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

#Hostliste
HOSTS="192.168.1.1 192.168.1.2 192.168.1.3 192.168.1.4 192.168.1.5 192.168.1.6 192.168.1.7 192.168.1.8"
#--------#

#Log
LOGFILE=ping.txt
rm ping.txt 2> /dev/null
echo "$(date)" > ping.txt
echo "---------------------------" >> ping.txt
echo "" >> ping.txt
# --------------------------------------------#


for myHost in $HOSTS
do
  [ `ping -c 1 -i 1 $HOSTS | grep -wc 100.0%` -eq 0 ]; 
    # 100% failed 
    echo "0" >> ping.txt
   else
    echo echo "1" >> ping.txt
  fi
done

Ich hoffe Ihr könnt mir weiterhelfen!

Besten Dank im Voraus

Gruß Iv0ry

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5582

Du kannst einfach den Rueckgabewert von ping verwenden, anstatt grep zu verwenden:

1
2
3
4
> ping -c 1 127.0.0.1 > /dev/null; echo $?
0
> ping -c 1 10.0.0.98 > /dev/null; echo $?
1

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

In Zeile 22 ist das echo doppelt, du verwendest $HOSTS statt $myHost im Ping-Befehl und statt ping und grep hintereinander zu schalten könnte man wie von sebix schon erwähnt den Exit-Code auswerten:

1
2
3
4
5
6
7
8
for myHost in $HOSTS
do
  if ping -c 1 -i 1 "$myHost" > /dev/null; then
    echo "1" >> ping.txt
  else
    echo "0" >> ping.txt
  fi
done

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

Iv0ry schrieb:

Hi Leute, ich versuche mich Grade an einem Shellscript, was die Erreichbarkeit der Clientrechner per Ping überwachen soll und im Fehlerfall (nicht per Ping erreichbar) mir eine E-Mail an meine @gmx.de Adresse senden soll. ...

Im Beispiel habe ich 8 IP-Adressen genommen. In der Realität sind es knapp 30 (nicht hintereinander es gibt auch freie Adressen dazwischen).

Das könntest Du auch mit arp-scan machen. Z. B. bei 0 gibt es keine eMail und bei 1 gibt es eine eMail mit der Datei "hostscanned.txt" als Anhang.

:~$ rm -f hostscanned.txt && sudo arp-scan -q --arpsha=<MAC-Adresse> --file=./hostlist.txt | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' >> hostscanned.txt && diff -q hostlist.txt hostscanned.txt; echo $?
0
:~$ rm -f hostscanned.txt && sudo arp-scan -q --arpsha=<MAC-Adresse> --file=./hostlist.txt | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' >> hostscanned.txt && diff -q hostlist.txt hostscanned.txt; echo $?
Dateien hostlist.txt und hostscanned.txt sind verschieden.
1

EDIT:

BTW: Statt IP-Adressen, kann man die Ausgabe von arp-scan, auch auf die MAC-Adressen der Geräte im W/LAN auswerten und vergleichen.

Siehe z. B. die Ausgabe von:

sudo arp-scan -vN -I <Interface> 192.168.1.0/24

sebix Team-Icon

Moderator, Webteam

Anmeldungsdatum:
14. April 2009

Beiträge: 5582

Willst du das zur Uebeung selbst schreiben, oder willst du ein Monitoring?

Wenn du was funktionierendes haben willst, nagios und icinga kannst du selbst hosten. Der Service von http://uptimerobot.com/ ist kostenlos.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17604

Wohnort: Berlin

1
2
3
4
5
  if ping -c 1 -i 1 "$myHost" > /dev/null; then
    echo "1" >> ping.txt
  else
    echo "0" >> ping.txt
  fi

Die Zahlen 0 und 1 enthalten nichts, was maskiert werden müsste, und werden auf absehbare Zeit auch nie etwas enthalten, was maskiert werden müsste.

Den Rückgabewert kann man auch ohne if/else gleich an die Logdatei hängen:

1
2
  ping -c 1 -i 1 "$myHost" > /dev/null
  echo $? >> ping.txt

Diese Backtick-Unsitte bekommen wir wohl nie aus den Leuten raus?

1
[ `ping -c 1 -i 1 $HOSTS | grep -wc 100.0%` -eq 0 ]; 

Du brauchst es ja eh nicht, aber wenn, dann bitte:

1
[ $(ping -c 1 -i 1 $HOSTS | grep -wc 100.0%) -eq 0 ]; 

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11248

Wohnort: München

user_unknown schrieb:

Den Rückgabewert kann man auch ohne if/else gleich an die Logdatei hängen:

1
2
  ping -c 1 -i 1 "$myHost" > /dev/null
  echo $? >> ping.txt

Der TE wollte das anders herum, als der Exit-Code das liefern würde:
Iv0ry schrieb:

das Ergebnis in eine Textdatei (untereinander) schreiben ( 0 = nicht erreichbar 1 = erreichbar)

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

seahawk1986 schrieb:

1
2
  ping -c 1 -i 1 "$myHost" > /dev/null
  echo $? >> ping.txt

Der TE wollte das anders herum, als der Exit-Code das liefern würde:
Iv0ry schrieb:

das Ergebnis in eine Textdatei (untereinander) schreiben ( 0 = nicht erreichbar 1 = erreichbar)

... na, dann machen wir das doch einfach - mit Shell Arithmetic:

1
2
  ping -c 1 -i 1 "$myHost" > /dev/null
  echo $((! $?))  >> ping.txt

LG,

track

Iv0ry

(Themenstarter)

Anmeldungsdatum:
1. Oktober 2010

Beiträge: 3

Wow, danke für eure Nachrichten! ☺

Ich muss das alles mal testen bin über eure Hilfsbereitschaft aber sehr positiv überrascht. Daher zunächst herzliches Danke! Ich melde mich dann zurück, wenn ich es getestet habe. ☺

Gruß Iv0ry

Antworten |