volker01
Goto Top

IP Adressen aus Textdatei mit Hostnamen auflösen.

Hallo Gemeinde,
nachdem ich schon häufig bei fündig wurde,
versuche ich mal meine erste Frage zu formulieren:

Ich verwende zur Fehleranalyse ein Batch-Datei als IP-Scanner.Das funktioniert auch gut.
Als Ergebnis erhalte ich eine Text-Datei mit IP-Adressen von Geräten die antworten.
Nun möchte ich im zweiten Schritt per batch die gefundenen IP-Adressen mit ping -a auch auch die Hostnamen auflösen lassen.
Ich habe noch keine Vorstellung wie ich das umsetzten kann.

Beispiel einer IP Textdatei:
192.168.178.1
192.168.178.2
192.168.178.7
192.168.178.8

Viele Grüße
Volker01

Content-ID: 204127

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

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

bastla
bastla 28.03.2013 um 20:38:44 Uhr
Goto Top
Hallo volker01!

Mit einem "ping -a" etwa so:
@echo off & setlocal
for /f %%i in (IP.txt) do call :ProcessIP %%i
goto :eof

:ProcessIP
set "Host="  
for /f "tokens=2" %%a in ('ping -a -n 1 %1') do if not defined Host set "Host=%%a"  
if "%Host%" neq "wird" echo %1: %Host%  
goto :eof
Grüße
bastla
volker01
volker01 28.03.2013 um 21:03:55 Uhr
Goto Top
Hallo Bastla,
das war ja superschnell,

ich hab's gerade mal getestet, das Ergebnis wird aber nicht angezeigt:
mit mtee sieht's der Ablauf so aus:

20:55:23.279 C:\Users\ve02\Desktop\ip>for /F %i in (IP.txt) do call :ProcessIP %i
20:55:23.279 C:\Users\ve02\Desktop\ip>call :ProcessIP 192.168.178.1
20:55:23.279 C:\Users\ve02\Desktop\ip>set "Host="
20:55:23.279 C:\Users\ve02\Desktop\ip>for /F "tokens=2" %a in ('ping -a -n 1 192.168.178.1') do if not defined Host set "Host=%a"
20:55:23.365 C:\Users\ve02\Desktop\ip>if not defined Host set "Host=wird"
20:55:23.365 C:\Users\ve02\Desktop\ip>if not defined Host set "Host=von"
20:55:23.365 C:\Users\ve02\Desktop\ip>if not defined Host set "Host=fr"
20:55:23.365 C:\Users\ve02\Desktop\ip>if not defined Host set "Host=Gesendet"
20:55:23.365 C:\Users\ve02\Desktop\ip>if not defined Host set "Host=Zeitangaben"
20:55:23.365 C:\Users\ve02\Desktop\ip>if not defined Host set "Host=="
20:55:23.371 C:\Users\ve02\Desktop\ip>if "wird" NEQ "wird" echo 192.168.178.1: wird
20:55:23.371 C:\Users\ve02\Desktop\ip>goto :eof

Grüße
Volker01
MrNetman
MrNetman 28.03.2013 um 21:17:25 Uhr
Goto Top
warum neu erfinden?

angry IP-Scanner liefert das sofort und schnell.
http://angryip.org/w/Home
Sogar noch mit der Möglichkeit einen Portscan anzuhängen. für z.B: Serverdienste und so.

Dann etwas komplexer: Superscan v4 von McAfee
Soft Perfect Network Scanner
Advanced IP Scanner V2

Nutze ich immer.

Gruß
Netman
Endoro
Endoro 28.03.2013 aktualisiert um 21:26:23 Uhr
Goto Top
Naja, noch ein Versuch:

@echo off &setlocal
for /f %%i in (ip.txt) do for /f "tokens=2" %%j in ('ping -a -n 1 %%i^|find "["') do echo %%i = %%j  



bb
volker01
volker01 28.03.2013 um 22:33:14 Uhr
Goto Top
@ Netman: Ich suche eine Batch Lösung, Danke.
@ bastla und mfm4aa: mit tokens=5 klappt's.
(Ping wird ausgeführt für)

Frage ist also gelöst.
Vielen Dank für Eure Hilfe. Allein hätte ich das nie hinbekommen.

Grüße Volker01
bastla
bastla 28.03.2013 aktualisiert um 23:25:06 Uhr
Goto Top
Hallo volker01!

Wenn, wie in diesem Fall, "ping -a" den Namen nicht auflöst, sondern nur
Ping wird ausgeführt für 192.168.178.1 mit 32 Bytes Daten:
ausgibt [Edit] hatte zum Test nur ein "unbekanntes" Gerät angepingt, sodass dann natürlich nur die Adresse und nicht der Name ausgegeben wurde [/Edit], wird natürlich nix angezeigt (dafür sorgt die Abfrage in Zeile 8).

Eigentlich wäre aber für die Namensauflösung ohnehin "nslookup" zu verwenden - das sähe dann so aus:
@echo off & setlocal
for /f %%i in (IP.txt) do call :ProcessIP %%i
goto :eof

:ProcessIP
set "Host="  
for /f "tokens=2" %%a in ('nslookup %1^|findstr /b "Name:"') do echo %1: %%a  
goto :eof
Wenn Du keinen FQDN haben willst, dann mit folgender Zeile 7:
for /f "tokens=2 delims=. " %%a in ('nslookup %1^|findstr /b "Name:"') do echo %1: %%a
Grüße
bastla
Endoro
Endoro 28.03.2013 um 23:31:58 Uhr
Goto Top
Ich dachte, dieses wird gesucht:

Ping fritz.box [192.168.178.1] mit 32 Bytes Daten:
Sonst gibt's auch keine Brackets im Ping output.

nslookup kannte ich bisher gar nicht, schick!


bb
volker01
volker01 29.03.2013 um 01:02:12 Uhr
Goto Top
Hallo Bastla,
die Lösung mit nslookup ist noch schöner und auch viel schneller als ping -a.
Ergebnis Beispiel:
192.168.178.1: fritz.box
192.168.178.2: SERVER.fritz.box
*** 192.168.178.7 wurde von fritz.box nicht gefunden: Non-existent domain

Wenn man möchte, kann man ja mit findstr die Zeilen ohne Namensauflösung noch filtern.
Auch die Lösung ohne FQDN funktioniert.


Grüße
Volker01
volker01
volker01 29.03.2013 um 18:58:16 Uhr
Goto Top
Hier jetzt mein fertiges Ergebnis.
Scannt Netzwerk nach aktiven IP-Geräten, versucht Hostnamen aufzulösen.
Legt eine Textdatei mit dem Ergebnis im gleichen Vezeichnis ab.
Bereinigt Anzahl der Logs. (Behalte n neueste Logs).
Auswahlmenü für Eingabe IP-Bereich, Ping-Anzahl und Antwortzeit, manuelle Wiederholung oder automatischer Dauertest.

@ECHO off & setlocal
title Find IP-Adressen
REM   find_IP Version 2.0 veh 2013-03-29
cd /D %~dp0

	REM Standard-Vorgabe:
	SET "ping_anzahl_A=1"  
	SET "ping_wartezeit_A=200"  
	SET "Anzahl_Logfiles=40"  

REM == Aktuelles Datum und Uhrzeit werden formatiert und Variablen zugewiesen ==
FOR /F "tokens=1-3 delims=/. " %%a in ('date/T') do set CDATE=%%c-%%b-%%a  
FOR /F "tokens=1-2 delims=/: " %%a in ('time/T') do set CTime=%%a-%%b  
if exist "ip_adressen.txt" ren "ip_adressen.txt" "ip_adressen_%CDATE% %CTime%.txt"  

ECHO.
ECHO     Aktuelles Netz:
ECHO     ---------------
ipconfig
ECHO.
ECHO.
ECHO.
ECHO     Finde IP-Adressen:
ECHO     ------------------
ECHO.
ECHO     Es wird eine Textdatei mit IP-Adressen im gleichen Verzeichnis angelegt.
ECHO.
ECHO     Bitte geben Sie den ERSTEN TEIL des IP-Netzwerkes ein:
ECHO.
ECHO     Den OEFFENTLICHEN TEIL angeben:
ECHO     z.Bsp.:  192.168.178.  (inkl. letztem Punkt!)
ECHO.
ECHO.
ECHO Eingabe und Enter:
set /p ip=
Echo.

ECHO.>> ip_adressen.txt
Echo Startzeit: %DATE% - %time%>> ip_adressen.txt
ECHO.>> ip_adressen.txt

:wh
ECHO ANZAHL DER PING-VERSUCHE eingeben und Enter- oder
ECHO Enter = Standard = "%ping_anzahl_A%"  
ECHO Eingabe:
set /p ping_anzahl=

ECHO MAX. ANTWORT-WARTEZEIT auf Ping eingeben und Enter - oder
ECHO Enter = Standard = "%ping_wartezeit_A% ms"  
ECHO Eingabe:
set /p ping_wartezeit=

ECHO DAUERTEST? (laeuft bis zum manuellem Abbruch)
ECHO Enter = NEIN       1 und Enter für Dauertest
ECHO Eingabe:
set /p Dauertest=

ECHO ===================================================>> ip_adressen.txt
ECHO      EIGENE IP-ADRESSE(N):>> ip_adressen.txt
ECHO ===================================================>> ip_adressen.txt
ipconfig /all>> ip_adressen.txt
ECHO.>> ip_adressen.txt && (ECHO.>> ip_adressen.txt)
ECHO.

:wh2
ECHO.
if "%ping_anzahl%"=="" set ping_anzahl=%ping_anzahl_A%  
if "%ping_wartezeit%"=="" set ping_wartezeit=%ping_wartezeit_A%  
set "wh="  
if exist ip_temp.txt del ip_temp.txt >nul
if exist ip_temp2.txt del ip_temp2.txt >nul

ECHO ===================================================>> ip_adressen.txt
ECHO      ERKANNTE IP-ADRESSE(N):>> ip_adressen.txt
ECHO ===================================================>> ip_adressen.txt
ECHO.>> ip_adressen.txt
ECHO Ping Anzahl=%ping_anzahl% >> ip_adressen.txt
ECHO Ping Wartezeit=%ping_wartezeit% >> ip_adressen.txt
ECHO.>> ip_adressen.txt

ECHO Starte Scan: && ECHO ----------- && ECHO.

for /L %%N IN (1, 1, 255) DO (
        ECHO IP: %ip%%%N wird angepingt.
		REM -n Ping n-mal; -w Warte max. Mili-Sekunden auf Antwort.
        ping %ip%%%N -n %ping_anzahl% -w %ping_wartezeit% | find "TTL">> ip_temp2.txt && ECHO %ip%%%N>> ip_temp.txt && ECHO IP: %ip%%%N erkannt.  
        Rem   ping %ip%%%N -n 1 | find "TTL" && ECHO %ip%%%N>> ip_temp.txt  
)
rem type ip_temp.txt>> ip_adressen.txt
rem ECHO.>> ip_adressen.txt
type ip_temp2.txt>> ip_adressen.txt
ECHO.

ECHO.>> ip_adressen.txt
ECHO ===================================================>> ip_adressen.txt
ECHO      ERKANNTE Hostnamen: (nslookup)>> ip_adressen.txt
ECHO ===================================================>> ip_adressen.txt
ECHO.>> ip_adressen.txt

ECHO.
for /f %%i in (ip_temp.txt) do call :ProcessIP %%i
goto next1
goto :eof

:ProcessIP
set "Host="  
for /f "tokens=2" %%a in ('nslookup %1^|findstr /b "Name:"') do echo %1: %%a>> ip_adressen.txt  
goto :eof

:next1

ECHO.>> ip_adressen.txt
ECHO ***************************************************>> ip_adressen.txt
ECHO.>> ip_adressen.txt
ECHO    Fertig - Endzeit: %DATE% - %time%>> ip_adressen.txt
ECHO.>> ip_adressen.txt

cls
type ip_adressen.txt

if "%Dauertest%"=="1" ECHO.>> ip_adressen.txt && ECHO.>> ip_adressen.txt && (ECHO *** DAUERTEST ***>> ip_adressen.txt) && ECHO.>> ip_adressen.txt  
if "%Dauertest%"=="1" ECHO. && ECHO. && (ECHO *** DAUERTEST ***) && ECHO. && ECHO. && (goto wh2)  

ECHO. && ECHO. && ECHO.
ECHO   Wiederhole IP-Scan im selben Netz?
ECHO ---------------------------------
ECHO   Taste 1 und Enter = Wiederhole Scan.
ECHO.
ECHO   Enter = IP-Liste mit Datum speichern und Beenden.
ECHO.
set /p wh=
if "%wh%"=="1" ECHO. && (ECHO     Wiederhole IP-Scan) && ECHO. && (ECHO    *** WIEDERHOLE SCAN: ***>> ip_adressen.txt) && (ECHO.>> ip_adressen.txt) && (ECHO.>> ip_adressen.txt) && goto wh  
if "%wh%"=="" goto End  

:End
ren "ip_adressen.txt" "ip_adressen_%CDATE% %CTime%.txt"  
ECHO.

REM Lösche alte ip_adressen Dateien, lasse Anzahl n neueste stehen.
FOR /f "skip=%Anzahl_Logfiles% delims=" %%i IN ('dir "ip_adressen*.txt" /a-d /b /o-d') DO (  
del "%%~i"  
)
if exist ip_temp.txt del ip_temp.txt >nul
if exist ip_temp2.txt del ip_temp2.txt >nul
EXIT
Johnrif
Johnrif 26.11.2013 um 17:45:50 Uhr
Goto Top
Unterstützung, einen schnellen Scanner verwenden, wie z. B. Advanced IP Scanner: http://www.advanced-ip-scanner.com/de/