[Batch] NSLookup Batch, der DNS-Server Status prüft & warnt

little_evil101

Grünschnabel
Hallo liebe Member!
Hab mich mal hier neu angemeldet, scheint ein nettes Forum zu sein ;)

Zu meinem Problem:
Ich brauche ein Batch-Script, das mehrere DNS-Server in einer Liste (servers.txt) ausliest, die dann mit "nslookup" auf ihre Funktionstüchtigkeit überprüft werden. (Der zu prüfende Host bleibt gleich z.B. immer http://www.google.com da ja nur der Server überprüft werden soll ob er funktioniert.
Das Ergebnis soll gespeichert und dann ausgewertet werden.
Bei einem Fehler soll das ganze noch im Windows System-Log als Error vermerkt werden (diesen Teil weiß ich schon)
Das ganze Script soll auch so klein wie möglich bleiben.

Ich habe das auslesen jetzt mit for-Schleifen gemacht und das auswerten soll mit "findstr" oder "find" geschehen.

Hier die Zeile zum auslesen, überprüfen und Ergebnisse abspeichern:
Code:
for /f %%i in (servers.txt) do @nslookup www.google.com %%i 1>>results.txt 2>>errors.txt

Damit kommen die Ergebnisse in die results.txt und die Fehler extra in die errors.txt (beides in 1 geht in der for-schleife leider nicht :confused:)
Nun weiß ich aber nicht genau wie ich da jeden Server extra auslese bzw. die Fehler zuordne, denn die zwei txt Dateien passen zum Vergleichen gar nicht gut zusammen.

Zur praktischen Anwendung:
Das ganze soll dann in einer Serverumgebung eingesetzt werden, um automatisch gewarnt zu werden wenn ein DNS-Server nicht ordnungsgemäß funktioniert.
(Der System-Log wird von einer speziellen Software auf Fehler überprüft)

Bin für andere Vorschläge, Verbesserungen, Lob und Kritik offen :D
Seid bitte nicht böse wenn ich etwas nicht gleich kapiere, ich bin unter 18 und Lehrling ;)
 
Also ich würde das ein bisschen anders machen:

Mein Batch File (mit anleihen aus http://www.ericphelps.com/batch/samples/HostsExpired.txt )
Code:
@echo off
SET SERVERFILE=D:\temp\servers.txt
SET STATSFILE=D:\temp\dns.stats

more %STATSFILE%>%STATSFILE%

for /f %%i in (%SERVERFILE%) do (
  nslookup -type=A test.server.tld %%i 2>nul | find /c "Address" | find "2" >nul
  if errorlevel 1 (
    echo %DATE% %TIME% %%i geht >> %STATSFILE%
  ) ELSE (
    echo %DATE% %TIME% %%i geht nicht >> %STATSFILE%
  )
)

Danach hast du eine Datei zum auswerten

Gruss
Alex
 
Zuletzt bearbeitet:
Hallo Alex ;)
Vielen Dank für den Vorschlag!
Ich kann das Script derzeit zwar nicht so gut testen (hab zu Hause keine Serverlandschaft :D) aber im kleinen Netzwerk funktioniert das schon sehr gut ;)
Morgen werde ich es dann noch ausgiebig an den Servern testen.
Ich lass derweil den Thread noch auf Status "ungelöst" bis morgen, aber ich glaube du hast mir schon sehr geholfen :)

MfG
little_evil
 
Ok, ich habe es jetzt noch einmal getestet, aber ziemlich alle Server werden als nicht funktionierend gemeldet. Ausser einer: ein offener DNS-Server von Google (8.8.8.8). Ich weiß nicht genau was da jetzt nicht hinhaut.
Ich weiß auch nicht genau warum diese Zeile eine "2" auslesen soll:

nslookup -type=A [intra-nwt] %%i 2>nul | find /c "Address" | find "2" >nul

Sollte die Zeile den Error-Output (2) auslesen?
Das [intra-nwt] hab ich natürlich ausgetauscht mit meiner IP (bin im Netzwerk).
Ich habe die Server separat in der cmd ausprobiert und sie haben funktioniert :confused:

Hier die Test-Ergebnisse in den dns.stats (Hab testweise auch ein paar "Fake-Server" reingetan):
Code:
15.07.2011  9:57:03,31 Server1 geht nicht 
15.07.2011  9:57:03,31 Server2 geht nicht 
15.07.2011  9:57:03,31 help(fake-server) geht nicht 
15.07.2011  9:57:03,31 8.8.8.8 geht 
15.07.2011  9:57:03,31 abc(fake-server) geht nicht

Könnte man das Script nicht noch ein bisschen einfacher machen, also ohne Datei zum auswerten, sodass bei einem error sofort der Server+Error in den System-Log eingetragen werden?

z.B.
Code:
eventcreate /L SYSTEM /I ERROR /SO nslookup-script /ID %ID% /D Server %server% funktioniert nicht!

Ich hoffe ich verlange nicht zu viel :)
 
Ok, da hab ich doch einen internen Testserver von mir noch im Skript stehen lassen. :)

Der Trick bei der Befehlszeile ist eigentlich das find /c "Address" davor.
Schau dir mal die Ausgabe eines funktionierenden DNS Aufrufes an und den eines fehlgeschlagenen.

Bei einem funktionierendem stehen 2 Adress Zeilen drin, bei einem nicht funktionierenden eine. Die /c Option beim find zählt die passenden Zeilen und das zweite find überprüft, ob genau 2 Zeilen gefunden wurden.

Und da kommen wir auch schon zu einem Problem :) Ich habe die "geht" und "geht nicht" Zeile vertauscht.
Kommt es dann bei dir mit der Ausgabe hin, wenn du die Ausgabe "umdrehst"?
Das aus nem Firmennetz kein direkter DNS Lookup aus dem Internet geht ist nicht ungewöhnlich.

Interessant wäre die Ausgabe der nslookup Befehle ohne die find's. Dann könnte man mehr damit anfangen.

Deine zweite Frage geht einfach:
lösche den else () Zweig raus und schreibe statt der verbliebenen echo Zeile deinen Befehl rein.
%server% musst du mit %%i austauschen.


Gruss
Alex
 
Zuletzt bearbeitet:
Ahh danke, jetzt ist mir einiges klarer ;)

Jetzt hab ich mal das Script ein bisschen zurechtgestutzt:
Code:
@echo off
SET SERVERFILE=servers.txt
 
for /f %%i in (%SERVERFILE%) do (
  nslookup -type=A [meine-ip] %%i 2>nul | find /c "Address" | find "2" >nul
  if errorlevel 1 (eventcreate /L SYSTEM /I ERROR /SO nslookup-script /ID 1 /D Server %%i funktioniert nicht!)
)

Gut, jetzt ist es aber so, dass die "Fake-Server", die in der servers.txt vorhanden sind auch als funktionierend eingestuft werden, obwohl sie gar nicht vorhanden sind. (soll einen "Totalausfall" eines Servers darstellen :D)
Falls der Server nicht gefunden wird, gibt der Befehl trotzdem eine Antwort weil er auf einen anderen Server (Standard) ausweicht. Daraus resultiert, dass das Ergebnis stimmt und der Fehler somit nicht im System-Log steht/erkannt wird.
Die Fehlermeldung das der Server nicht gefunden wird, wird ja mit 2>nul weggefiltert. Vielleicht kann man da was verwenden :confused:?

Kann man dass nicht irgendwie erzwingen dass er explizit nur die angegebenen Server prüft (ohne ausweichen)?

(Ich kenn mich mit der Serverstruktur der Firma nicht sehr aus, da es zu groß ist :D , aber das Script soll irgendwo zentral in einem Subnet alle dortigen DNS-Server abfragen.)
 
Kannst du die komplette Ausgabe von so einem nslookup auf einen nicht existenten Server mal hier posten inkl Befehlszeile.
Bei mir funktioniert nämlich das Skript genau in so einem Fall schon
Code:
C:\Windows\system32>nslookup mein.server.tld 10.10.10.10
DNS request timed out.
    timeout was 2 seconds.
Server:  UnKnown
Address:  10.10.10.10

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** Zeitüberschreitung bei Anforderung an UnKnown.

Es steht nur einmal Address drin und liefert ein funktioniert nicht zurück. Ich hab sogar den Netzwerkverkehr mitgesnifft, der frägt bei mir nur 10.10.10.10 und springt nicht auf die im Windows konfigurierten DNS Server weiter.

Jetzt fällts mir auf, falls er den Namen des DNS Servers nicht auflösen kann, dann ignoriert er die Angabe und frägt die Eingestellten. Da muss mans ein bischen umbauen.
Code:
@echo off
SET SERVERFILE=servers.txt

for %%i in (%SERVERFILE%) do call :DNSCHECK %%i
goto :EOF
:DNSCHECK
  nslookup %1 2>nul | find /c "Address" | find "2" > nul
  if errorlevel 1 goto :ERROR %1
  nslookup -type=A [meine-ip] %1 2>nul | find /c "Address" | find "2" >nul
  if errorlevel 1 goto :ERROR %1
goto :EOF
:ERROR
eventcreate /L SYSTEM /I ERROR /SO nslookup-script /ID 1 /D Server %1 funktioniert nicht!
:EOF

Sollte denk ich jetzt so funktionieren wie gewünscht. Batch ist so lang her, aber ist nie schlecht wenn mans wieder mal ein bisschen auffrischt. :)
 
Also das wird es wahrscheinlich sein, dass der so überspringt.
Also hier der lookup für einen nicht-vorhandenen Server (hab aber zur Sicherheit die IPs/Servernamen abgeändert):
Code:
C:\Documents and Settings\Administrator>nslookup 9.31.43.123 abc.firma.com
*** Can't find server address for 'abc.firma.com':
Server:  standard.dns.firma.com
Address:  9.23.173.13

Name:    MeinPC.firma.com
Address:  9.31.43.123

Wenn ich das Script verwende, kommt folgendes am Ende:

ERROR: Invalid Argument/Option - 'servers.txt'.
Type "EVENTCREATE /?" for usage.

Da hats wahrscheinlich die Variablen, die weitergegeben werden durcheinander gewirbelt ;)

Also, ich muss mich da nochmal zu Hause beschäftigen, aber jetzt mus ich mit dem Zug weg ;)
 
Ok, ich denke jetzt ist das Thema gelöst ;) Ein Arbeitskollege setzt sich am MO mit mir zusammen und dann schauen wir das gemeinsam durch.

Trotzdem vielen Dank für deine Hilfe, hat mir sehr weitergeholfen! :D
 

Neue Beiträge

Zurück