none
Controllo DNS interni tramite (nslookup script) RRS feed

  • Domanda

  • Buongiorno a tutti,

    sto cercando di creare uno script che mi permetta di effettuare il controllo a DNS (interno alla rete) di un determinato ip/record A.

    Cosa vorrei fare:

    1. uno script che mi chieda di inserire un alias/ip
    2. faccia un nslookup per ogni dns server presente nella lista
    3. mi restituisca il relativo output

    Cosa sto testando:

    @echo off
    set /P IpList= Digita l'ip o l'alias da verificare... 
    
    ::          list of name servers
    for %%i in (dns1...
                dns2...
                dns3... ) do (
    
    ::            list of sites
      for %%j in (%IpList%
    		do (
    		
    for /f "tokens=1*" %%k in ('nslookup %%j %%i') do (
    if [%%k]==[Server:] set server=%%l
    if [%%k]==[Address:] set address=%%l
    if [%%k]==[Addresses:] set address=%%l
    if [%%k]==[Name:] set name=%%l)
    call echo %date% , %time% , %%j , %%name%%
    )
    )

    Inutile dirvi che non funziona granchè... potreste darmi una mano?

    Grazie 1000!


    • Modificato Luca80 lunedì 24 giugno 2013 09:33
    lunedì 24 giugno 2013 09:12

Risposte

  • Ecco uno script funzionante (SO in italiano)

    @echo off
    setlocal
    set /P IpList= Digita l'ip o l'alias da verificare... 
    cls
    
    type nul > "%temp%\tmp.cmd"
    ::          list of name servers
    for %%D in (192.168.1.111
                192.168.1.100) do (
      for /f %%i in ('echo %IpList%') do (
         for /f "skip=2 tokens=1,2 delims=: " %%R in ('nslookup %%i %%D^|findstr /v "^$"') do (
           (echo %%R |findstr /i "nome")    && (echo   set /p A=nome=%%S ^<nul) >> "%temp%\tmp.cmd"
    	   (echo %%R |findstr /i "Address") && (echo   echo Address=%%S)        >> "%temp%\tmp.cmd"
         )2>nul 1>nul 
       )
     )
    call "%temp%\tmp.cmd"

    Nel cassetto avevo anche una versione in powershell che mi era servita per testare una ventina di subnet con tre dns. Dopo aver finito script  e controllo, mi sono ricordato di dnscmd che probabilmente mi avrebbe semplificato notevolmente lo script.

    Function chk-IP ($ip,$IPdns) {
        #$Linea Ë l'array che conterra' il risultato delle query 
    	# inserisco due valori nell'array
    	$Linea=@($IPdns,$ip)  
    	
    	#query "dritta" Record A al dns 
    	$recA= nslookup.exe -type=A $ip $IPdns 2>&1
    	
    	# aspetto un mezzo secondo 
    	# sembra che i dns vadano in crisi dopo un po' di nslookup!
    	Start-Sleep -m 500
    	
    	#query "rovesio" reverse
    	$recPTR= nslookup.exe -type=PTR $ip $IPdns 2>&1
    	
    	#Estraggo l'errore delle query ( se presente usando ) le espressioni regolari
    	$errore_A=$recA      |select-string -pattern "\*\*\*"| % { $_  -replace " .*:",""}
    	$errore_PTR=$recPTR  |select-string -pattern "\*\*\*"| % { $_  -replace " .*:",""}
    	
    	# se l'errore Ë presente allora ci sono tre asterischi ***
    	if ($errore_A -match "\*\*\*") {
      		$Linea+=@("$errore_A")
    	} else {
    	    # prendo le righe che mi interessano e le ripulisco (-replace) con una regexp
      		$recA|select-string -pattern "Nome:"|% { $_.ToString() -replace "Nome: +","" }| % {$Linea+=@($_)}
    	}
    
    	if ($errore_PTR -match "\*\*\*") {
      		$Linea+=@("$errore_PTR")
    	} else {
      		$recPTR|select-string -pattern "name =" | % { $_.ToString() -replace "^.*name = ","" }| % {$Linea+=@($_)}
    	}
    	#trasformmo l'array in una stringa separata da ;
    	$Linea -join ";" 
    }
    
    
    cls
    #$sottoreti=@(70,71,72,73,74,75,76,77,78,79,85,107,116,182,183,191,210,211)
    
    # la lista dei miei dns
    $DNSservers=@("192.168.13.10","192.168.13.24")
    
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
    $ip_or_name = [Microsoft.VisualBasic.Interaction]::InputBox("Inserire ip o nome", "IP", "10.10.10.1")
    
    # scrivo l'intestazione del mio CSV nel file c:\temp\dnschk.csv
    "DNS;IP;Record A;Reverse2"|
    		out-file   c:\temp\dnschk1.csv -encoding ascii 
    # controllo
    $DNSservers | 
        	% { chk-IP  -ip  "$ip_or_name"  -ipdns $_  |
    	 	        out-file   c:\temp\dnschk1.csv -encoding ascii -Append
          	  }
    "Fine"		  
    # riga seguente non ricordo se sia funzionante
    # dnscmd 17.24.18.1 /enumrecords   mio.dominio.it  `@ /Type A /additional | % {($_ -replace("[`t| ]", ";")) -replace "\[.*\]","ing"  } |out-file -Encoding ascii -FilePath c:\temp\dns4.csv
    

    Ciao Gas


    Gastone Canali >http://www.armadillo.it

    Se alcuni post rispondono al tuo quesito (non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili . GRAZIE! Ricorda di dare un occhio anche QUI


    lunedì 24 giugno 2013 22:37
    Moderatore

Tutte le risposte

  • Ecco uno script funzionante (SO in italiano)

    @echo off
    setlocal
    set /P IpList= Digita l'ip o l'alias da verificare... 
    cls
    
    type nul > "%temp%\tmp.cmd"
    ::          list of name servers
    for %%D in (192.168.1.111
                192.168.1.100) do (
      for /f %%i in ('echo %IpList%') do (
         for /f "skip=2 tokens=1,2 delims=: " %%R in ('nslookup %%i %%D^|findstr /v "^$"') do (
           (echo %%R |findstr /i "nome")    && (echo   set /p A=nome=%%S ^<nul) >> "%temp%\tmp.cmd"
    	   (echo %%R |findstr /i "Address") && (echo   echo Address=%%S)        >> "%temp%\tmp.cmd"
         )2>nul 1>nul 
       )
     )
    call "%temp%\tmp.cmd"

    Nel cassetto avevo anche una versione in powershell che mi era servita per testare una ventina di subnet con tre dns. Dopo aver finito script  e controllo, mi sono ricordato di dnscmd che probabilmente mi avrebbe semplificato notevolmente lo script.

    Function chk-IP ($ip,$IPdns) {
        #$Linea Ë l'array che conterra' il risultato delle query 
    	# inserisco due valori nell'array
    	$Linea=@($IPdns,$ip)  
    	
    	#query "dritta" Record A al dns 
    	$recA= nslookup.exe -type=A $ip $IPdns 2>&1
    	
    	# aspetto un mezzo secondo 
    	# sembra che i dns vadano in crisi dopo un po' di nslookup!
    	Start-Sleep -m 500
    	
    	#query "rovesio" reverse
    	$recPTR= nslookup.exe -type=PTR $ip $IPdns 2>&1
    	
    	#Estraggo l'errore delle query ( se presente usando ) le espressioni regolari
    	$errore_A=$recA      |select-string -pattern "\*\*\*"| % { $_  -replace " .*:",""}
    	$errore_PTR=$recPTR  |select-string -pattern "\*\*\*"| % { $_  -replace " .*:",""}
    	
    	# se l'errore Ë presente allora ci sono tre asterischi ***
    	if ($errore_A -match "\*\*\*") {
      		$Linea+=@("$errore_A")
    	} else {
    	    # prendo le righe che mi interessano e le ripulisco (-replace) con una regexp
      		$recA|select-string -pattern "Nome:"|% { $_.ToString() -replace "Nome: +","" }| % {$Linea+=@($_)}
    	}
    
    	if ($errore_PTR -match "\*\*\*") {
      		$Linea+=@("$errore_PTR")
    	} else {
      		$recPTR|select-string -pattern "name =" | % { $_.ToString() -replace "^.*name = ","" }| % {$Linea+=@($_)}
    	}
    	#trasformmo l'array in una stringa separata da ;
    	$Linea -join ";" 
    }
    
    
    cls
    #$sottoreti=@(70,71,72,73,74,75,76,77,78,79,85,107,116,182,183,191,210,211)
    
    # la lista dei miei dns
    $DNSservers=@("192.168.13.10","192.168.13.24")
    
    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') | Out-Null
    $ip_or_name = [Microsoft.VisualBasic.Interaction]::InputBox("Inserire ip o nome", "IP", "10.10.10.1")
    
    # scrivo l'intestazione del mio CSV nel file c:\temp\dnschk.csv
    "DNS;IP;Record A;Reverse2"|
    		out-file   c:\temp\dnschk1.csv -encoding ascii 
    # controllo
    $DNSservers | 
        	% { chk-IP  -ip  "$ip_or_name"  -ipdns $_  |
    	 	        out-file   c:\temp\dnschk1.csv -encoding ascii -Append
          	  }
    "Fine"		  
    # riga seguente non ricordo se sia funzionante
    # dnscmd 17.24.18.1 /enumrecords   mio.dominio.it  `@ /Type A /additional | % {($_ -replace("[`t| ]", ";")) -replace "\[.*\]","ing"  } |out-file -Encoding ascii -FilePath c:\temp\dns4.csv
    

    Ciao Gas


    Gastone Canali >http://www.armadillo.it

    Se alcuni post rispondono al tuo quesito (non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili . GRAZIE! Ricorda di dare un occhio anche QUI


    lunedì 24 giugno 2013 22:37
    Moderatore
  • Ciao Gas,

    grazie 1000 per la risposta, ci siamo quasi...

    ma se volessi fare un controllo preventivo del sistema operativo?

    Ho visto che c'è il comando:

    wmic.exe os get oslanguage

    che restituisce il codice del language del sistema operativo... 

    intanto grazie 1000, se hai un'attimo di tempo per implementare il controllo sarebbe perfetto (solo ita e eng).

    martedì 25 giugno 2013 14:40
  • ...
    ...
    cls
    
    (wmic os get oslanguage | findstr "1040" ) && set N="Nome"
    (wmic os get oslanguage | findstr "1033" ) && set N="Name"
    
    ...
    ... 
    ... 
     (echo %%R |findstr /i %N% ) .....    
    ...
    
    
    Bye Gas

    Gastone Canali >http://www.armadillo.it

    Se alcuni post rispondono al tuo quesito (non necessariamente i miei), ricorda di contrassegnarli come risposta e non dimenticare di contrassegnare anche i post utili . GRAZIE! Ricorda di dare un occhio anche QUI

    martedì 25 giugno 2013 19:46
    Moderatore
  • Grazie!
    mercoledì 26 giugno 2013 13:30