PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bash Skript



zielscheibe
20.10.05, 14:41
Ich will per Skript einen Rechner erst anpingen und wenn das geht
abfragen ob er auf SNMP Anfragen antwortet.
Irgendwo ist ein Fehler drin, aber ich finde ihn net...




if [ "$#" -lt "1" ]; then
echo Namen des Netzelementes angeben --- Programmabbruch!!!
exit 1
fi

echo Pinge 4x zu Host -------'>' $1

if [ ping -c4 $1 ]; then
echo Teste SNMP -------'>' $1
if [ snmpwalk -v 1 -c public $1 system ]; then
echo "Alles OK :-)"
else
echo SNMP nicht verfuergbar
fi
else
echo Host nicht erreichbar
fi

Havoc_1986
20.10.05, 14:54
Was gibt er denn aus, wenn du das script startest???
Was sagen die logs???

Ohne Infos wird das schwer...

OpOs
20.10.05, 15:14
sicher, dass das nicht vielleicht

if (ping ...)
heissen muss?

Ixot
20.10.05, 17:39
echo Namen des Netzelementes angeben --- Programmabbruch!!!

Schlagt mich nicht, wenn ich mich irre, aber müsste es nicht


echo "Namen des Netzelementes angeben --- Programmabbruch!!!"

heißen, da /bin/bash das sonst als viele verschiedene Argumente verarbeitet?
Das gleiche würde dann für die anderen "echo"s gelten (gegebenenfalls einzelquoten >'< benutzen).



sicher, dass das nicht vielleicht
Code:

if (ping ...)

heissen muss?

Nein, if-statements sehen in der bash so aus:


if [[ args ]]
then
## statements
# elif [[ args ]]
## statements
# else
## statements
fi


edit: einzelne Klammern gehen auch, sind aber soweit ich weiß schlechtere Praxis.

OpOs
20.10.05, 17:55
nun, meine bash kenntnisse sind nur rudimentaer, aber er will doch sicher den return-code von ping haben und das geht mit ()

[] ist doch, wenn ich mich richtig erinnere, ein synonym fuer 'test'

smoon
20.10.05, 18:08
OpOs hat recht, probiers mal mit `if ( ping ... ) ; then ... ; fi'. Sollte funktionieren.

Tim Taylor
20.10.05, 20:56
So sollte es gehen. Den ersten Teil habe ich getestet (ping), SNMP habe ich unter Cygwin gerade nicht parat :p
Der 2. Teil sollte dann aber analog funktionieren.


#!/bin/bash

if [ $# -ne 1 ]
then
echo Namen des Netzelements angeben. Abbruch
exit 1
fi

echo "Starte ping ..."

ping -c4 $1
RC=$?

if [ $RC -ne 0 ]
then
echo "Ping nicht erfolgreich. Abbruch
exit 2
fi

zielscheibe
21.10.05, 07:44
Danke für die Ideen :)

Das Skript funktioniert jetzt.
Warum muß ich den Test aus der If-Bedingung nehmen wie unten ?



ping -c4 $1
RC=$?
if [ $RC -ne 0 ]


Das Programm sieht jetzt so aus:



if [ "$#" -lt "1" ]; then
echo Namen des Netzelemtes angeben --- Programmabbruch!!!
exit 1
fi

echo Pinge 2x zu Host -------'>' $1

ping -c2 $1 &> /dev/null
RC=$?
if [ $RC -eq 0 ]; then
echo ping ok
echo Teste SNMP -------'>' $1
snmpwalk -v 1 -c public $1 system &> /dev/null
RC=$?
if [ $RC -eq 0 ]; then
echo "Alles OK :-)"
else
echo SNMP nicht verfuergbar
fi
else
echo Host nicht erreichbar
fi

xstevex22
21.10.05, 07:53
Hi,

ein bisschen weniger Code wäre:



if [ "$#" -lt "1" ]; then
echo Namen des Netzelemtes angeben --- Programmabbruch!!!
exit 1
fi

echo "Pinge 2x zu Host -------'>' $1"

if (ping -c2 $1 &> /dev/null); then
echo "ping ok"
echo "Teste SNMP -------'>' $1"
if (snmpwalk -v 1 -c public $1 system &> /dev/null); then
echo "Alles OK :-)"
else
echo "SNMP nicht verfuergbar"
fi
else
echo "Host $1 nicht erreichbar"
fi

Ixot
21.10.05, 17:06
nun, meine bash kenntnisse sind nur rudimentaer, aber er will doch sicher den return-code von ping haben und das geht mit ()
Meine sind wohl noch rudimentärer. Was die quotenzeichen angeht habe ich mich auch geirrt, wie ein einfacher Versuch gezeigt hat...

*liest sich `man bash` mal wieder durch*

Der Gestreifte
21.10.05, 17:25
Was die quotenzeichen angeht habe ich mich auch geirrt...
*liest sich `man bash` mal wieder durch**g*
Aber nimm bitte das normale Hochkomma