Ping skript

Locked
Message
Author
alx
Posts: 64
Joined: 20. Jan 2000 21:37
Contact:

Ping skript

#1 Post by alx »

Möchte ein kl. skript schreiben, mit dem ich automatisch alle Rechner aus einer Ip-Liste anpinge und die Antworten(oder das Schweigen) auswerten kann. Kann mir da jemand einen Tipp geben, bevor ich mich durch sämtliche Doku. durchkämpfen muss. So z.B wie ich das Programm "ping" so mit Parameter bompardiere, dass es einen Ergebniswert zurückliefert etc...

mfg AlX

hugenay

Re: Ping skript

#2 Post by hugenay »

lässt sich doch leicht machen, hoffe die Formatierungen gehen net flöten. Ausgegangen wird von der Datei "rechner", in der die Liste ist:
Julia 192.168.0.2
Lena 192.168.0.4
Anne 192.168.0.7


#!/bin/sh
#dies ist /home/skripte/ping_skript
# gibt jeder 1 Sekunde (=ping -w 1)

ping_liste=/home/skripte/rechner
Ausgabe=/home/skripte/online_nachfrage$$
Anz_Rechner=$(wc -l <$ping_liste)

typeset -i i=1
while [ $i -le "$Anz_Rechner" ] ; do
Rechner=$(sed -n -e "${i}p" $ping_liste);
set -- $Rechner
Rechner_online=$(ping -c 1 -w 1 $2)
if [ -n "`echo $Rechner_online | grep \"1 packets received\"`" ] ; then
echo "$1 ist online" >>$Ausgabe ;
else
echo "$1 ist offline" >>$Ausgabe ;
fi
i=i+1
done
cat "$Ausgabe"
rm $Ausgabe
exit 0


hoffe hat sich kein fehler eingeschmuggelt, ich habs nur kurz kontrolliert
gruss hug
mist, hab gerad in der Vorschau gesehen, dass die Formatierungen weg sind, naja ist auch so einigermassen übersichtlich

AlX

Re: Ping skript

#3 Post by AlX »

schönes Skript aber leider gibt es die Option -w bei dem Programm "ping" nicht. Ich benutze Redhat 5.2. Gibt es eine andere Möglichkeit um nur eine kurze Zeit einen host abzufragen. Mit der -c (count) Option werden leider nur die empfangenen Packete gewertet und nicht die Gesendeten.

AlX

Jochen

Re: Ping skript

#4 Post by Jochen »

Hmm, an Deinem Skript kann man aber noch was verbessern...

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">#!/bin/bash
#dies ist /home/skripte/ping_skript
# gibt jeder 1 Sekunde (=ping -w 1)

PING_LISTE=/home/skripte/rechner

while read RECHNER IP_ADRESSE ; do
if ping -c 1 -w 1 $IP_ADRESSE | grep "1 packets received" >/dev/null 2>&1 ; then
echo "$RECHNER ($IP_ADRESSE) ist online"
else
echo "$RECHNER ($IP_ADRESSE) ist offline"
fi
done < $PING_LISTE

exit 0
</font><hr></pre></blockquote>

'N bisschen kürzer und übersichtlicher (ja, ja, ich weiss, manchmal bin ich echt 'n Klugscheisser...).

Aber davon abgesehen: Das ping aus netkit-base-0.12-29 (RH 6.0) kann die Option w für wait nicht. Kann also auf älteren Distros schief gehen.

Meine Alternative wäre gewesen, genau einen Ping auf die Broadcast-Adresse zu machen. Scheinbar antworten aber nicht unbedingt alle Rechner, manche scheinen ein Broadcast-ICMP-ECHO zu verwerfen <img src="http://www.pl-forum.de/UltraBoard/Images/Sad.gif" border="0" align="middle">.

germannightwing
Posts: 29
Joined: 08. Aug 2000 20:53
Location: Oberhausen
Contact:

Re: Ping skript

#5 Post by germannightwing »

Hallo,

Vielleicht hilft es dir wenn du das Script auf das nötigste reduzierst und
dann einen cronjob startest der alle 5 min. ( oder so ) das script startet.

In die /etc/crontab müsste dann folgendes: * 5 * * * update-ping

Damit würde dann alle 5 Min. das script gestartet.

bye
/ Bernd /

Jochen

Re: Ping skript

#6 Post by Jochen »

Um am "ping -w 1" vorbeizukommen, muss man 'n bisschen tricksen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
#/bin/bash

terminating_ping() {
ping "$@" &
sleep 2
kill -INT $!
}

PING_LISTE=/home/skripte/rechner
while read RECHNER IP_ADRESSE ; do
if terminating_ping $IP_ADRESSE | grep "^[0-9][0-9]* bytes from" >/dev/null 2>&1 ; then
echo "$RECHNER ($IP_ADRESSE) ist online"
else
echo "$RECHNER ($IP_ADRESSE) ist offline"
fi
done < $PING_LISTE

exit 0
</font><hr></pre></blockquote>

terminating_ping() ist eine Shell-Funktion, die sämtliche Parameter an ping weitergibt, den ping im Hintergrund startet, 2 sec wartet und den Ping dann explizit abschiesst.

Jochen

Re: Ping skript

#7 Post by Jochen »

Ahem, Bernd, fast:

* 5 * * * update-ping

sorgt dafür, dass das Skript von 5.00 bis 5.59 zu jeder Minute ausgeführt wird... Das gewünschte erhält man mittels

*/5 * * * * update-ping

(Aber sieh Dir vorher mein Skript [letzte Version] an, das tut's so wie spezifiziert...)

hugenay

Re: Ping skript

#8 Post by hugenay »

@Jochen
klär mich nochens über `read` auf. (von Klugscheissern kann man lernen -:))
Du liest in deinem Skript mit read 2 Variablen ein, glaub ich, und die werden aus $PING_LISTE eingelesen. Ping_Liste hat das Format "Rechnername IP_Adresse" (?). Was mich nur wundert ist, dass man $PING_LIste ans Ende der While-Schleife stellen kann und dann per Eingabeumlenkung einlesen kann. Warum geht das? Oder täusch ich mich und das geht ganz anders?
Und ich dachte Funktionen leitet man mit "function" ein, hab leider nur fenster98 hier, kann das alles nur "virtell" angehen.

Ping ist wäre bei ner firewall sowieso nicht so sinnvoll, ich lehne im lan daheim beispielsweise sämtliche echo_requests ab....

Jochen

Re: Ping skript

#9 Post by Jochen »

read liest (wie immer) von stdin. Dabei werden die Eingabezeilen in Felder aufgeteilt. Als Trennzeichen wird der Inhalt der Shellvariablen IFS verwendet. Bei Änderung von IFS vorsichtig sein, da auch die Shell selbst zum Auftrennen der Kommandozeile in Argumente darauf zurückgreift! read liefert bei gelesener Zeile einen Exit-Code von 0, bei EOF 1, in Fehlerfällen 2, also sehr praktisch für while-Schleifen.

Die Eingabeumleitung am Ende der while-Schleife gilt tatsächlich für alle Kommandos im Schleifenkörper, inkl. der while-Bedingung. Schau Dir mal das folgende Pseudo-Kommando an:<pre>cat datei | mycmd</pre>Ist doch 1 Prozess zuviel (cat), da man ja auch<pre>mycmd <datei</pre>schreiben kann. Jetzt setze anstelle von "mycmd" eine while-Schleife ein, und die Syntax ist schon nicht mehr so merkwürdig. Ein Problem ist höchstens die Übersichtlichkeit, wenn der Schleifenkörper sehr gross ist.

Und ja, Funktionen kann man in der bash (und der Korn-Shell ksh, wahrscheinlich also auch in der zsh) mit dem Schlüsselwort "function" definieren. Aber nicht in der Bourne-Shell sh! Und da ich damit Shellprogrammieren gelernt habe, verwende ich auch heute noch die sh-Syntax, da bash und ksh die auch verstehen.

Die Beschreibung zu read findest Du in der man-Page zu bash, da es eine eingebaute Shell-Funktion ist.

Alle Klarheiten beseitigt? <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">

hugenay

Re: Ping skript

#10 Post by hugenay »

@jochen
so ziemlich -:), nur 1 frage noch, was hat 'while' davon, wenn es einen exitcode 2 von read bekommt. die while schleife läuft doch solange 'true' (0) und hört bei 'false' (1) auf, wenn nu 2 übergeben wird passiert doch dasselbe wie bei 'false', dacht ich bisher wenigstens...

Jochen

Re: Ping skript

#11 Post by Jochen »

'Türlich, da denkst Du die ganze Zeit auch schon richtig. Diese Exit-Codes haben halt zur Folge, dass bei Lesefehlern (keine Berechtigung, Platte abgeraucht, ...) die Schleife auch abbricht! Das nimmt man schon mal als nettes "Feature" wahr, wenn man im awk mittels getline Zeilen händisch (an der Hauptschleife des awk vorbei) einliest. getline gibt C-mässig 1 für Erfolg, 0 für EOF und -1 für Lesefehler zurück. Ich möchte nicht wissen, wie viele potentielle Endlosschleifen da draussen lauern, weil die "so-kurz-wie-möglich"-Fraktion nur<pre>while (getline var < "datei") {
# Potentielle Endlosschleife
}</pre>anstelle von<pre>while ((getline var < "datei") > 0) {
# Bricht immer ab, es sei denn, man liest aus /dev/zero...
}</pre>codet... Wohlgemerkt: Das Code-Fragment oben ist <i>awk</i>-Code, nicht Shell! Aber das beleuchtet halt, weshalb ich a) alle Fälle erwähne und b) über diese Einteilung froh bin.

Noch was? Ich lasse gerne mal meine schulmeisterliche Art raushängen! <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

hugenay

Re: Ping skript

#12 Post by hugenay »

nochmal thx. hast du vielleicht irgendwelche tips auf lager wie man sich awk aneignen kann (dokus, urls), ich fand sed ja schon hart, aber wenn ich awk nur sehe....
hab schon überlegt das sed&awk buch von o'reilly zu kaufen...
bis dahin, freu mich gerade über debian 2.2 -:)

germannightwing
Posts: 29
Joined: 08. Aug 2000 20:53
Location: Oberhausen
Contact:

Re: Ping skript

#13 Post by germannightwing »

Hallo Jochen,

Kann nur ein Tippfeeler gewesen sein.

bye
/ Bernd /
<!--http--><a href="http://www.blue-temple.de" target="_blank"><img src="http://www.blue-temple.de/footer.png" border="0"></a><!--url-->

Jochen

Re: Ping skript

#14 Post by Jochen »

Wenn Du einigermassen Englisch kannst, hast Du mit einiger Sicherheit schon eine sehr gute Doku an bord: "info awk" (info gawk?!?) Die ist nicht schlecht, mit einführenden Beispielen usw.

sed ist nur kompliziert, wenn man ihn für Sachen verwenden will, für die er nicht gebaut ist. <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> Ist halt 'n Editor, dem man vorher sagen muss, was er tun soll. awk dagegen ist eine ausgewachsene Programmiersprache mit Erleichterungen & Features zur Textbe- und -verarbeitung, Reportgenerierung usw. Natürlich nicht mit perl zu vergleichen, aber der Lernaufwand ist geringer. Das wenige, was manchen Leuten beim awk richtig Schwierigkeiten macht, sind einmal die assoziativen Arrays und zweitens die Übersicht zu behalten, was der awk schon alles für einen erledigt, bevor man selbst den ersten Handschlag tut <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">.

hugenay

Re: Ping skript

#15 Post by hugenay »

thx für die infos nochmal...
dann muss ich mich wohl mal ran wagen -:)

Locked