Convalida gli indirizzi IP nell'input dell'utente con script batch


0

Correlati:
Script per assegnare e rimuovere IP secondari arbitrari a un'interfaccia

Sto cercando di aumentare lo script nella domanda precedente, convalidando l'input dell'utente in modo che lo script funzioni solo con indirizzi IP e subnet-mask validi. Sono consapevole che sono disponibili diverse espressioni regolari che controlleranno gli IP, ma non so come (o anche se c'è un modo) di utilizzarlo rispetto alle variabili nel mio script batch con comandi nativi di Windows XP.

Qualcuno può indicarmi la giusta direzione, qui?

Risposte:


1

Ho armeggiato. Non chiedermi perché ... ma qui c'è un controllo piuttosto ampio per il tuo indirizzo IP / gateway / subnet-mask:

@Echo Off

set NEW-IPADDR=192.168.1.2
set NEW-MASK=255.255.255.240
set NEW-GW=192.168.1.1

set RETURN=isValidIP
goto checkIP

:isValidIP
echo.We are good to go.

REM ---------------------------------------------------------------------
REM Do whatever with the IP/mask/GW here.  The values appear to be valid.
REM ---------------------------------------------------------------------
goto :End

:checkIP
for /f "tokens=1,2,3,4 delims=. " %%a in ("%NEW-IPADDR%") do set ip1=%%a&set ip2=%%b&set ip3=%%c&set ip4=%%d
set /a decIP=(16777216*%ip1%)+(65536*%ip2%)+(256*%ip3%)+%ip4% 2> nil
for /f "tokens=1,2,3,4 delims=. " %%a in ("%NEW-MASK%") do set mask1=%%a&set mask2=%%b&set mask3=%%c&set mask4=%%d
set /a decMask=(16777216*%mask1%)+(65536*%mask2%)+(256*%mask3%)+%mask4% 2> nil
set /a netAddr="%decIP%&%decMask%" 2> nil
for /f "tokens=1,2,3,4 delims=. " %%a in ("%NEW-GW%") do set gw1=%%a&set gw2=%%b&set gw3=%%c&set gw4=%%d
set /a decGW=(16777216*%gw1%)+(65536*%gw2%)+(256*%gw3%)+%gw4% 2> nil
set /a gwNetAddr="%decGW%&%decMask%" 2> nil


set isBadLabel=badIP
if %ip1% EQU 127 (goto :badIP)
if %ip1% EQU 0 (goto :badIP)
set num=%ip1%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%ip2%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%ip3%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%ip4%
call :checkNum
if %badNum% equ 1 (goto :End)

set isBadLabel=badMask
set num=%mask1%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%mask2%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%mask3%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%mask4%
call :checkNum
if %badNum% equ 1 (goto :End)

set isBadLabel=badGW
set num=%gw1%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%gw2%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%gw3%
call :checkNum
if %badNum% equ 1 (goto :End)
set num=%gw4%
call :checkNum
if %badNum% equ 1 (goto :End)

set testmask=-2
set bcast=0

:loopmask
  set /a testmask=%testmask%+%testmask%
  if %decmask% EQU %testmask% (set bcast=%testmask%)
if %bcast% neq 0 (goto :goodMask)
if %testmask% geq -16777216 (goto :loopmask)

:badMask
echo.Bad subnet mask. (%NEW-MASK%)  Check and try again.
echo.
goto :End

:badIP
echo.Bad IP Address. (%NEW-IPADDR%)  Check and try again.
echo.
goto :End

:goodMask
set /a bcast="%bcast%^-1"
set /a bcast=%netAddr%+%bcast%
if %decIP% equ %bcast% (goto :badIP)

if %decIP% equ %decGW% (goto :badGW)
if %gwNetAddr% neq %netAddr% (goto :badGW)

if %decGW% equ %bcast% (goto :badGW)
if %decGW% equ %netAddr% (goto :badGW)

goto :goodGW
:badGW
echo.Bad Gateway Address. (%NEW-GW%)  Check and try again.
echo.
goto :End

:goodGW
goto %RETURN%

goto :End

:checkNum
set badNum=0
set /a numval=%num% 2> nil
if "z%num%" neq "z%numval%" (set badNum=1) else (
  if %num% GTR 255 (set badNum=1) else (
    if %num% LSS 0 (set badNum=1)
  )
)
if %badNum% equ 1 (goto %isBadLabel%)
goto :EOF

:End

Funziona anche con Vista e 7.

---- whops ha dimenticato di verificare se il gateway è l'indirizzo di rete / indirizzo di trasmissione. ----


Wow. Dovrò sedermi con questo e sceglierlo a volte. Grazie.
Iszi,

Sto ancora cercando di capire perché ho fatto tutto questo. imho ... L'unico bit di confusione è quando ho fatto il controllo della subnet mask, ho iniziato con -2 e l'ho raddoppiato ripetutamente. perché un numero negativo? bene i file batch vengono elaborati in un ambiente a 32 bit (anche nelle finestre a 64 bit) con un numero intero con segno. -2 = 0xFFFFFFFE = 11111111111111111111111111111110. Inizialmente raddoppio prima di preoccuparmi di usarlo come maschera ... quindi iniziamo con 11111111111111111111111111111100 che si traduce in 255.255.255.252 che è la prima subnet-mask utilizzabile.
TheCompWiz

Dovrebbe verificare quanto segue: sono i valori in ciascun ottetto tra 0 e 255. L'IP inizia con 127 ... è la maschera di sottorete effettivamente valida ... è l'IP l'indirizzo di rete o l'indirizzo di trasmissione ... è il gateway all'interno della stessa sottorete dell'IP ... ecc ...
TheCompWiz

Wow. È molto più di quanto mi sarei preso la briga di farlo controllare. Sarei andato bene con ogni ottetto <= 255, davvero. Se potessi aggiungere altri commenti al codice, per aiutare a spiegare l'uso e le funzioni di alcuni dei comandi, sarebbe fantastico. In caso contrario, lo modificherò quando avrò tempo di smontarlo da solo in seguito. Grazie ancora!
Iszi,

Inoltre, le tre SETrighe iniziali dovrebbero essere SET /Ppoiché l'intento è quello di convalidare l'input IP da parte dell'utente - non incluso nello script.
Iszi,

0

Puoi usare FindStr con RegEx:

/ r : utilizza le stringhe di ricerca come espressioni regolari. Findstr interpreta tutti i metacaratteri come espressioni regolari a meno che tu non usi / l.

Utilizzo di espressioni regolari con findstr

Findstr è in grado di trovare il testo esatto che stai cercando in qualsiasi file o file ASCII. Tuttavia, a volte hai solo una parte delle informazioni che desideri abbinare o desideri trovare una gamma più ampia di informazioni. In questi casi, findstr ha la potente capacità di cercare schemi di testo usando espressioni regolari.

Le espressioni regolari sono una notazione per specificare modelli di testo, al contrario di stringhe esatte di caratteri. La notazione usa caratteri e metacaratteri letterali. Ogni personaggio che non ha un significato speciale nella sintassi dell'espressione regolare è un carattere letterale e corrisponde a un'occorrenza di quel personaggio. Ad esempio, lettere e numeri sono caratteri letterali. Un metacarattere è un simbolo con significato speciale (un operatore o delimitatore) nella sintassi delle espressioni regolari.

La tabella seguente elenca i metacaratteri che findstr accetta. inserisci qui la descrizione dell'immagine

Tieni presente che il sistema RegEx di FindStr non è così robusto come molti altri, quindi non tutte le espressioni regolari funzioneranno senza una piccola modifica.


Findstr trova testo, ma può restituire input allo script batch per sapere se il testo è stato trovato o meno in un modo che posso usare per IFun'istruzione?
Iszi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.