PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Linux Bashscript



mandark
19-04-2010, 09:41
Hallo,

Da ich mit der linux bash normalerweise nichts zu tun habe, aber nun einige Abfragen darueber stricken muss, koennt ihr mir da vielleicht/wahrscheinlich helfen.
Problemstellung:
Auf 20 Systeme, die sich nur einem oktett, das aufzaehlend ist per ssh connecten ( root, passwort wird interaktiv eingegeben )
dort pruefen ob per which logsurfer /usr/bin/logsurfer zurueckliefert.
Falls fehlschlaegt, exitcode mit uname -n hat fehler.
Falls ein true zurueckkommt, pruefen ob 2 logsurfer prozesse laufen $(pidof logsurfer)
Wenn auch dies korrekt ist, muss man pruefen, ob in /dir/log1.conf ein grep nach $(uname -n) ein true zurueckkommt.
Wenn auch dies korrekt ist, noch 2 weitere greps
a) nach LOG1 /etc/init.d/logsurfer
b) nach 255.255.255 aus /etc/sysconfig/network/ifcfg-eth*

Die Systeme, die ueberprueft werden sind alle mit dem gleichen suse os ausgestattet und sollten in der config auch alle gleich sein.

Da ich aber bashmaessig nie wirklich viel gemacht habe, war mein ansatz jetzt




for {1..20}
do
if [ ssh -l ip.$1.ip.ip root ]
then
if [ which logsurfer ]
then
if [ "$(pidof logsurfer)" | "awk{NF =2}" ] //nicht sicher wie awk dort abgefragt wird
then
if [ grep $(uname -n) /dir/logsurfer/alert.conf ]
then
if [ grep LOG1/etc/init.d/logsurfer ]
then echo "$1"
if [ grep 255.255.255.0 /etc/sysconfig/network/ifcfg-eth* ]
then echo "Alle checks ok"
fi
fi
fi
fi
fi
done


Es ist wohl einfach zu primitiv, aber bin mir nicht sicher wie das awk da perfekt reinspielen soll
und ob die restlichen Abfragen dann so funktionieren koennten.

Ueber Hilfe freu ich mich und danke im vorhinein.

Cu

John W
20-04-2010, 16:46
Nimm statt awk lieber einfache bash-Tools:
[ $(pidof logsurfer | tr -d '0123456789' | wc -c) -eq 2 ]

Allerdings ist dein Skript nicht funktionsfähig, das hier sollte eher klappen:

for i in {1..20}
do
cat '[ "$(which logsurfer)" == "/usr/bin/logsurfer" ] || ( uname -n >&2 ; exit 1 )
[ $(pidof logsurfer | tr -d '0123456789' | wc -c) -eq 2 ] || exit 2
grep LOG1 /etc/init.d/logsurfer 2&> /dev/null || exit 3
grep 255.255.255.0 /etc/sysconfig/network/ifcfg-eth* 2&> /dev/null || exit 4' | ssh -l root ip.ip.ip.$i -p Passwort
done
2>> /dir/logsurfer/alert.conf
exitcode = $?
[ $exitcode -eq 0 ] && echo "Alle Checks OK bei ip.ip.ip.$i"
[ $exitcode -eq 1 ] && echo "which logsurfer ist nicht /usr/bin/logsurfer bei ip.ip.ip.$i"
[ $exitcode -eq 2 ] && echo "pidof logsurfer ergab nicht zwei Prozesse bei ip.ip.ip.$i"
[ $exitcode -eq 3 ] && echo "LOG1 nicht in /etc/init.d/logsurfer bei ip.ip.ip.$i"
[ $exitcode -eq 4 ] && echo "255.255.255.0 nicht in /etc/sysconfig/network/ifcfg-eth\* bei ip.ip.ip.$i"
Allerdings war deine Problemstellung an einiegen Stellen ziemlich schwammig, ich habe mich mehr an den Befehlen orientiert (die IP-Adressen unterscheidensich in Netzwerken meist in dem letzten Oktett, wenn tatsächlich das zweite Oktett gemeint sein sollte, abändern).

Du musst allerdings das Passwort als Parameter übergeben, oder im Skript selbst; du könntest das umgehen, indem du das Skript auf jedem Rechner abspeicherst und per "ssh -l root ip.ip.ip.$i <Pfad zum ausführbaren Skript>" aufrufst (dann wird das Passwort interaktiv abgefragt).

Das würde dann z.B. so aussehen:
/usr/local/bin/checklogsurfer.sh auf den 20 Rechnern:


#!/bin/bash
# "chmod +x" auf dieses Skript anwenden!
[ "$(which logsurfer)" == "/usr/bin/logsurfer" ] || ( uname -n >&2 ; exit 1 )
[ $(pidof logsurfer | tr -d '0123456789' | wc -c) -eq 2 ] || exit 2
grep LOG1 /etc/init.d/logsurfer 2&> /dev/null || exit 3
grep 255.255.255.0 /etc/sysconfig/network/ifcfg-eth* 2&> /dev/null || exit 4


Check-Skript auf deiner Kiste:


for i in {1..20}
do ssh -l root ip.ip.ip.$i 2>> /dir/logsurfer/alert.conf
exitcode = $?
[ $exitcode -eq 0 ] && echo "Alle Checks OK bei ip.ip.ip.$i"
[ $exitcode -eq 1 ] && echo "which logsurfer ist nicht /usr/bin/logsurfer bei ip.ip.ip.$i"
[ $exitcode -eq 2 ] && echo "pidof logsurfer ergab nicht zwei Prozesse bei ip.ip.ip.$i"
[ $exitcode -eq 3 ] && echo "LOG1 nicht in /etc/init.d/logsurfer bei ip.ip.ip.$i"
[ $exitcode -eq 4 ] && echo "255.255.255.0 nicht in /etc/sysconfig/network/ifcfg-eth\* bei ip.ip.ip.$i"
done

jeebee
20-04-2010, 19:26
Du musst allerdings das Passwort als Parameter übergeben, oder im Skript selbst; du könntest das umgehen, indem du das Skript auf jedem Rechner abspeicherst und per "ssh -l root ip.ip.ip.$i <Pfad zum ausführbaren Skript>" aufrufst (dann wird das Passwort interaktiv abgefragt).

Ich würde in so einem Fall eifach pubkey Authentifizierung verwenden. Mittels ssh-keygen einen Key erzeugen (falls noch nicht vorhanden) und dann einmalig mit
ssh-copy-id <server> den Public Key auf die Server kopieren und nie mehr ein Passwort (ausser der Key hat ne Passphrase) eingeben müssen.

mandark
21-04-2010, 09:45
Erstmal vielen dank fuer eure Informationen.
Leider ist bash nicht meine Staerke und es war zum teil eine notloesung, die ich jetzt gerne uebernommen habe.
Da ich das ganze noch nach ruby/perl uebersetzen werde um es fuer die ueberwachung in icinga zu nutzen.

Hab auch einen mittelweg noch gefunden, der ueber dsh auch dies ermoeglichen kann.

Ich habe wieder viel gelernt.

mandark
21-04-2010, 19:09
danke jeebee und John W nochmals.
Hab das jetzt auch in dem Umfang umgesetzt und es laeuft like a charme :).

Das zeigt, dem forum muss ich jetzt schon treu bleiben um euch mit weiteren Fragen zu nerven.

Cu