tahr09
Anmeldungsdatum: 5. Januar 2011
Beiträge: 946
|
Hallo, zu Beginn eines Bashscriptes würde ich gerne prüfen ob eine Adresse¹ erreichbar ist.
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
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
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. 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? 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
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
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
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
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
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. | 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
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: | nc -w 2 -z 192.168.178.20 2222
if [ $? = 1 ]
then
notify-send "..ist nicht erreichbar"
else
notify-send "..ist erreichbar"
fi
|
| curl -m 5 192.168.178.20:2222
if [ $? = 7 ]
then
notify-send ".. ist nicht erreichbar"
else
notify-send ".. ist erreichbar"
fi
|
👍
|
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
|