ubuntuusers.de

Ping auswerten

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

tahr09

Anmeldungsdatum:
5. Januar 2011

Beiträge: 946

Hallo,

zu Beginn eines Bashscriptes würde ich gerne prüfen ob eine Adresse¹ erreichbar ist.

  • ¹

    sftp://root@192.168.178.20:2222

Wenn ich diese Adresse theoretisch mit Nautilus öffnen könnte, so soll die Ausgabe heißen:

notify-send "..ist erreichbar"

Wenn nicht, dann soll das Gegenteil geschehen:

notify-send "..ist nicht erreichbar"

Ich könnte mir vorstellen, dass ich einen Ping sende, und dessen Ausgabe auswerte:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#! /bin/bash

#Ping senden
ping -c 1 192.168.178.20

#Ping auswerten
if [ Ping kam zurück ]
then
 notify-send "..ist erreichbar"

else
 notify-send "..ist nicht erreichbar"
fi

Wie das allerdings genau geht, weiß ich leider nicht.

Über etwas Hilfe, bzw. alternative Lösungen freue ich mich ☺

lg

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Als Einzeiler funktioniert sowas:

if echo $(ping -c 1 192.168.178.20) |grep Unreachable &>/dev/null; then notify-send "..ist nicht erreichbar"; else notify-send ".. ist erreichbar"; fi

es grept die ping-Ausgabe nach "Unreachable" (also ping ist erfolglos), wenn gefunden, "nicht erreichbar". Wenn nicht gefunden "erreichbar".

Musst halt noch "schönmachen" (Zeilenweise aufdröseln) für dein Script ☺

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Du willst ja nicht nur eine bestimmte IP-Adresse abfragen, sondern sogar einen konkreten Port (nämlich :2222).
Das geht mit ping nicht, dafür könntest Du aber curl nehmen. (→ http://linux.die.net/man/1/curl )

Du wirst Deinem Skript ganz sicher nicht das Root-Passwort mitgeben wollen, in sofern müsstest Du die Fehlermeldung "Passwort fehlt", die er dann zurückbekommt, auswerten.

Guck Dir einfach mal im Terminal an, was da so zurück kommt. Dann siehst Du wahrscheinlich schnell einen Ansatz, wie Du das mit sed oder grep sinnvoll auswerten kannst. Wenn die IP nicht erreichbar ist, wirft curl einen Fehler.

track

edit:
Antiqua: den Rückgabewert aus dem Text herauszugreppen ist viel zu umständlich. Du kannst direkt den Rückgabewert des ping auswerten:

if ping -c1 192.168.178.20 ; then 
        notify-send ".. ist erreichbar"
else    notify-send ".. ist nicht erreichbar"
fi

tahr09

(Themenstarter)

Anmeldungsdatum:
5. Januar 2011

Beiträge: 946

Hey,

der Einzeiler funktioniert nicht so recht. Es wird immer ausgegeben, dass die Adresse erreichbar ist.

Ich vermute, der Grund ist folgender:

Du willst ja nicht nur eine bestimmte IP-Adresse abfragen, sondern sogar einen konkreten Port (nämlich :2222). Das geht mit ping nicht

Curl kann sehr gut unterscheiden ob die Adresse erreichbar ist.

  • Wenn die Adresse erreichbar ist, sagt curl:

julian@Ubuntu:~$ curl 192.168.178.20:2222
SSH-2.0-dropbear_0.52

Curl beendet sich allerdings nicht, sondern läuft weiter. Welche Option könnte ich da noch mitgeben?

  • Wenn die Adresse nicht erreichbar ist, sagt curl:

julian@Ubuntu:~$ curl 192.168.178.20:2222
curl: (7) couldn't connect to host

Soweit funktioniert die Unterscheidung wunderbar ☺

Mit Sed und Grep habe ich noch nie gearbeitet. Ich werde mich morgen damit vertraut machen.

Bis dahin und Dankeschön soweit!

lg

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Jop, mein Fehler. Meine Lösung geht nur auf die Adresse, nicht auf den Port. Es prüft also nur, ob die 192.168.178.20 auf das ping antwortet und nicht, ob da auf Port 2222 irgendwas lauscht.

Ein habsch abah noch: statt curl mit nc im zero-I/O-mode:

if nc -w 2 -z 192.168.178.20 2222 &>/dev/null; then notify-send "..ist erreichbar"; else notify-send ".. nichtda"; fi

Edith: noch das -w 2 zugefügt, sonst versuchts nc lange, falls es die IP nicht gibt

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Curl beendet sich allerdings nicht, sondern läuft weiter. Welche Option könnte ich da noch mitgeben?

Guck nochmal in man curl unter dem Suchwort "timeout":

[-m/--max-time <seconds>
      Maximum time in seconds that you allow the whole operation to take. This is useful for preventing your batch jobs from hanging for hours
      due to slow networks or links going down. See also the --connect-timeout option.  

grep oder sed brauchst Du hier wahrscheinlich auch nicht, denn im Fehlerfall meldet sich auch curl mit einem entsprechenden Rückgabewert:

track@lucid:~$ curl 192.168.178.20:2222
curl: (7) couldn't connect to host
track@lucid:~$ echo $?
7
track@lucid:~$ curl -m 5 google.com:2222
curl: (28) connect() timed out!
track@lucid:~$ echo $?
28 

edit:
Mir schwant, warum Du ewig wartest: der sftp wartet auf das Passwort, doch es kommt nicht ...

edit2:
Antiqua, Dein Vorschlag mit nc ist gut ! - der hat anscheinend weniger Overhead, antwortet schneller und ist leichter auszuwerten:

track@lucid:~$ nc -z 192.168.178.1 2222
track@lucid:~$ echo $?
1
track@lucid:~$ nc -z 192.168.178.1 80
track@lucid:~$ echo $?
0 

LG,

track

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

track schrieb:

Antiqua, Dein Vorschlag mit nc ist gut !

Danke für die Blumen. Auch ein blindes Korn findet ab und zu mal ein brauchbares Huhn 😀

Man darf aber das -w n nicht vergessen, sonst versuchts nc eben ewig wenn der Host gar nicht existiert.

tahr09

(Themenstarter)

Anmeldungsdatum:
5. Januar 2011

Beiträge: 946

Hey, mit curl funktioniert das wunderbar und schnell, Danke.

Wenn die Adresse erreichbar ist, kommt der Wert 28 zurück. Ist sie nicht erreichbar, so ist die Ausgabe 7.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#! /bin/bash

#Auf Erreichbarkeit prüfen
curl -m 5 192.168.178.20:2222

#Auswerten
if [ $? = 7 ]
then
 notify-semd "Adresse ist nicht erreichbar"
else
 notify-send "Adresse ist erreichbar"
fi

nc verstehe ich nicht so recht, aber das macht ja nix.

Danke euch! 👍

Antiqua Team-Icon

Avatar von Antiqua

Anmeldungsdatum:
30. Dezember 2008

Beiträge: 4534

Julian92 schrieb:

nc verstehe ich nicht so recht, aber das macht ja nix.

nc - netcat ist das Schweizerarmee Messer für TCP/IP, klein schnell und für alles mögliche zu gebrauchen. Ein paar Beispiele kannst du z.B. hier nachlesen

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

Servus,

ich würde netcat (oder nmap) der curl-Variante auch vorziehen. curl ist nicht dafür gemacht, zu testen, ob da auf der anderen Seite etwas erreichbar ist, sondern zum Übertragen von Daten. Im Zweifelsfalle wirft curl der Gegenseite, so sie antwortet, einfach einen HTTP-Request entgegen, was bissel Murks ist. ☺

Außerdem, schau dir mal an, was deine Rückgabewerte bedeuten (man curl):

       7      Failed to connect to host.
       28     Operation  timeout.  The  specified  time-out period was
              reached according to the conditions.

Dass das bei dir „klappt“, scheint mir nur ein ungewollter Nebeneffekt zu sein.

tahr09

(Themenstarter)

Anmeldungsdatum:
5. Januar 2011

Beiträge: 946

So, da hatte ich gestern wohl ein Brett vor dem Kopf.

Ich verwende jetzt nc.

1
2
3
4
5
6
7
8
nc -z 192.168.178.1 2222

if [ $? = 1 ]
then
 notify-send "..nicht erreichbar"
else
 notify-send "..ist erreichbar"
fi

Kommt mir tatsächlich etwas schneller vor, Danke ☺

tahr09

(Themenstarter)

Anmeldungsdatum:
5. Januar 2011

Beiträge: 946

Zu früh gefreut..

Der Rückgabewert von

nc -z 192.168.178.1 2222 

ist immer 1.

nmap braucht meist sudo, und ist daher eher ungeeignet für mich. Kleine Tests führten zu keinem Ergebnis. Eventuell fehlt mir hier auch einfach die richtige Syntax?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Damit nc jetzt spezifisch das sftp Protokoll anspricht, müsste man ihn wahrscheinlich eine spezifischere Anfrage stellen lassen.
(allerdings kenne ich mich mit diesen Protokollen zu wenig aus, als dass ich Dir da weiterhelfen könnte)

Die Kehrseite ist natürlich, dass Du bei der curl-Variante eben auch nicht weißt, warum die Anfrage in den Timeout läuft ...

Die Frage ist: kriegst Du eine saubere Lösung mit nc hin, oder kannst Du mit der "wieso-es-geht-doch"-Lösung mit curl leben ?

Edit:
Eigentlich willst Du doch nur wissen, ob der betreffende Port offen ist. Dafür wäre nmap das richtige Werkzeug. (Vain hatte es ja schon vorgeschlagen) - dabei kannst Du nicht direkt den Rückgabewert verwerten, sondern musst den Ausgabetext mit grep absuchen:

nmap 192.168.178.30 -p 2222  |  grep "open" -q
echo $?

track

tahr09

(Themenstarter)

Anmeldungsdatum:
5. Januar 2011

Beiträge: 946

Die Frage ist: kriegst Du eine saubere Lösung mit nc hin, oder kannst Du mit der "wieso-es-geht-doch"-Lösung mit curl leben ?

Jetzt läuft beides:

  • Variante 1: nc

1
2
3
4
5
6
7
8
nc -w 2 -z 192.168.178.20 2222

if [ $? = 1 ]
then
 notify-send "..ist nicht erreichbar"
else
 notify-send "..ist erreichbar"
fi
  • Variante 2: curl

1
2
3
4
5
6
7
8
curl -m 5 192.168.178.20:2222

if [ $? = 7 ]
then
 notify-send ".. ist nicht erreichbar"
else
 notify-send ".. ist erreichbar"
fi

👍

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Prima ! ☺

Als "Edit:" hatte ich oben noch eine 3. Variante aufgegriffen, die der Sache nach vielleicht noch sinnvoller ist:

if ( nmap 192.168.178.20 -p 2222  |  grep "open" -q ) ; then
         notify-send "..ist erreichbar"
else     notify-send "..ist nicht erreichbar"
fi

LG,

track

Antworten |