thraex
Goto Top

Ping-Befehl mit FIND-Pipe in IF-Befehl einbauen

Schöne Grüße an die Community,,

derzeit bereitet mir eine simple Anforderung arge Probleme. Ich hoffe mit dem Wissen aus dem Kollektiv diese abschließen zu können.
Vorweg möchte ich erwähnen das ich in Sachen Scripts und Entwicklung lediglich ein leichtes Grundwissen habe.

Ist-Zustand:

Ein Kunde hat ein Netzwerk mit zwei getrennten Netzen. Intranet und Internet. Beide Netze laufen auf einer UTM-Appliance zusammen.
Intranet - Für Clients nahezu alle Ports ins Internet gesperrt, lediglich Teamviewer ist freigeschaltet. Server (außer TSRV) haben gefilterten Vollzugriff. TSRV wird als Client behandelt.
Internet - Unbeschränkter jedoch gefilterter Zugriff ins Internet

Anforderung:

Auf dem TSRV soll im Stundentakt via Scheduler ein Script laufen. In diesem Script wird geprüft ob die Internetverbindung offen ist oder nicht, und dies als Errorlevel zurückgeben. Hintergrund ist dass wir durch einen Bug vor kurzem unbeschränkten Zugriff aus dem Intranet ins Internet für die Clients hatten was so nicht wieder vorkommen darf. Dieses möchten wir nun überwachen.

Vom Script her habe ich versucht über einen If-Befehl in Kombination mit einem Ping und Find-Befehl ein eigenes Errorlevel zu erstellen da die Ping-interne Errorlevel-Rückgabe für unsere Anforderung nicht geeignet ist.

Der Ping-Befehl ansich funktioniert und gibt auch den gewünschten Wert zurück:
ping -n 3 google.de | find /C "Zielanschluss nicht erreichbar"  
Rückgabe in diesem Fall = 3
Den Ping-Befehl habe ich nun versucht in einen IF-Befehl zu bringen um anhand der Rückgabe den Errorlevel zu bilden.
if "ping -n 3 google.de | find /C \"Zielanschluss nicht erreichbar\"" == 3 set errorlevel=0 else set errorlevel=1  
Rückgabe hier ist "nicht" kann syntaktisch an dieser Stelle nicht verarbeitet werden.

Vermutlich hat die IF-Textzeile bei dem Errorlevel auch noch Fehler drin, diese kann ich jedoch noch nicht auswerten da mir das Script bereits beim Ping einen Abbruch bringt.

Grüße aus Buchholz
Thraex

Content-Key: 290681

Url: https://administrator.de/contentid/290681

Ausgedruckt am: 19.03.2024 um 05:03 Uhr

Mitglied: killtec
killtec 11.12.2015 aktualisiert um 11:51:48 Uhr
Goto Top
Hi,
du musst einfach die Errorlevels abfangen. Bei beiden.
Also dein 1. da fragst du den Errorlevel ab, welcher raus kommt und weißt dann, welchen du brauchst und baust das in eine IF-Abfrage und kannst dann danach entsprechend agieren.

Also sowas wie
ping ... | find ...
if %errorlevel% == 0 ...

Gruß
Mitglied: 122990
Lösung 122990 11.12.2015, aktualisiert am 14.12.2015 um 13:28:40 Uhr
Goto Top
Moin.
Ping auswerten ist Fehleranfällig zumal ist es dann meist sprachabhängig ist. Einen Ping machst du auf der CMD am besten sprachunabhängig über die WMI-Klasse Win32_PingStatus
wmic PATH Win32_PingStatus where Address='8.8.8.8' get StatusCode /format:list | find "StatusCode=0" >nul && echo Internet=OK || echo Internet=FEHLER    
Siehe auch
Automatische Ping schleife

Gruß grexit
Mitglied: Thraex
Thraex 14.12.2015 um 13:34:20 Uhr
Goto Top
Moin grexit,

danke für den Vorschlag. WMIC war mir bisher unbekannt, scheint soweit aber eine bessere Methode fürs Scripting zu sein als simple Batch, da werde ich mich mal ein wenig einarbeiten. So konnte ich mein Vorhaben nun schon fehlerfrei umsetzen. Als Ergänzung zum Abschluss hier der genutzte Code. Ich gehe direkt mit einem Exitcode aus dem Ping raus. In meinem Fall ist der Errorcode 0 wenn die Internetverbindung nicht besteht. Wenn der Ping durchgeht (Internet da) gibts den Errorcode 1001. Der Fehlercode wird letztendlich durch unsere eingesetzte Serverüberwachung ausgewertet und uns angezeigt.

@echo off
wmic PATH Win32_PingStatus where Address='8.8.8.8' get StatusCode /format:list | find "StatusCode=0" >nul && exit 1001 || exit 0  

Ich danke vielmals für die Unterstützung.