Sprawdź poprawność adresów IP w danych wejściowych użytkownika za pomocą skryptu wsadowego

0

Związane z:
Skrypt do przypisywania i usuwania dowolnych dodatkowych adresów IP do interfejsu

Próbuję rozszerzyć skrypt w powyższym pytaniu, sprawdzając dane wejściowe użytkownika, aby skrypt działał tylko z prawidłowymi adresami IP i maskami podsieci. Wiem, że dostępnych jest wiele różnych wyrażeń regularnych, które sprawdzają adresy IP, ale nie wiem, w jaki sposób (lub nawet jeśli jest sposób) użyć tego w stosunku do zmiennych w moim skrypcie wsadowym z natywnymi poleceniami systemu Windows XP.

Czy ktoś może wskazać mi właściwy kierunek tutaj?

Iszi
źródło

Odpowiedzi:

1

Majstrowałem. Nie pytaj mnie dlaczego ... ale tutaj jest dość obszerne sprawdzenie dla twojego adresu IP / bramy / maski podsieci:

@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

Działa nawet w widoku perspektywicznym i 7.

---- które zapomniało sprawdzić, czy brama jest adresem sieciowym / adresem transmisji. ----

TheCompWiz
źródło
Łał. Będę musiał z tym usiąść i czasami go rozdzielić. Dzięki.
Iszi
Nadal próbuję zrozumieć, dlaczego to wszystko zrobiłem. imho ... Jedyny mylący bit to sprawdzanie maski podsieci, zacząłem od -2 i podwajałem ją wielokrotnie. dlaczego liczba ujemna? pliki wsadowe są przetwarzane w środowisku 32-bitowym (nawet w 64-bitowych oknach) z podpisaną liczbą całkowitą. -2 = 0xFFFFFFFE = 11111111111111111111111111111110. Początkowo podwoję to, zanim zacznę używać tego jako maski ... zaczynamy od 11111111111111111111111111111100, co tłumaczy się jako 255.255.255.252, co jest pierwszą użyteczną maską podsieci.
TheCompWiz
Powinien sprawdzić następujące elementy: są wartościami w każdym oktecie między 0 a amp; 255. czy IP zaczyna się od 127 ... czy maska ​​podsieci jest rzeczywiście ważna ... czy IP to adres sieciowy lub adres transmisji ... jest bramą w tej samej podsieci co IP ... itd ...
TheCompWiz
Łał. To o wiele więcej, niż chciałbym to sprawdzić. Byłbym w porządku, gdyby każdy oktet był naprawdę <255; Gdybyś mógł dodać więcej komentarzy do kodu, aby pomóc wyjaśnić użycie i funkcje niektórych poleceń, byłoby świetnie. Jeśli nie, wyedytuję go, kiedy będę miał czas, żeby samemu go rozebrać. Dzięki jeszcze raz!
Iszi
Również pierwsze trzy SET linie powinny być SET /P ponieważ celem jest sprawdzenie poprawności adresów IP wprowadzonych przez użytkownika - nieuwzględnionych w skrypcie.
Iszi
0

Możesz użyć FindStr z RegEx:

/ r : Używa ciągów wyszukiwania jako wyrażeń regularnych. Findstr interpretuje wszystkie metaznaki jako wyrażenia regularne, chyba że użyjesz / l.

Używanie wyrażeń regularnych z findstr

Findstr jest w stanie znaleźć dokładny tekst, którego szukasz   dowolny plik lub pliki ASCII. Czasami jednak masz tylko część   informacje, które chcesz dopasować, lub chcesz znaleźć szerszy zakres   informacji. W takich przypadkach findstr ma potężne możliwości   wyszukuj wzory tekstu za pomocą wyrażeń regularnych.

Wyrażenia regularne są notacją do określania wzorców tekstu, jak   w przeciwieństwie do dokładnych ciągów znaków. Notacja używa literału   znaki i metaznaki. Każda postać, która nie ma   specjalne znaczenie w składni wyrażeń regularnych jest dosłowne   postać i dopasowuje wystąpienie tej postaci. Na przykład,   litery i cyfry są znakami dosłownymi. Metaznakiem jest a   symbol o specjalnym znaczeniu (operator lub separator) w   składnia wyrażeń regularnych.

Poniższa tabela zawiera metaznaki akceptowane przez findstr. enter image description here

Pamiętaj, że system RegEx FindStr nie jest tak solidny, jak wiele innych, więc nie wszystkie wyrażenia regularne będą działać bez drobnych modyfikacji.

Ƭᴇcʜιᴇ007
źródło
Findstr znajdzie tekst, ale czy może wrócić do skryptu wsadowego, czy tekst został znaleziony w sposób, który mogę wykorzystać IF komunikat?
Iszi