|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Многопоточный сканер сети на .bat |
|
CMD/BAT - Многопоточный сканер сети на .bat
|
Старожил Сообщения: 415 |
По мотивам этой темы.
В связи с тем, что PowerShell не владею, захотел попробовать реализовать подобный сканер средствами обычного командного интерпретатора. В итоге получился вот такой скрипт, многопоточность технически реализована созданием другого скрипта при старте многопоточного сканирования и запуском его многочисленных копий без создания отдельного окна с помощью Start с ключом /B. Все активные IP записываются в файл ip.log. Начальная и конечная точки диапазона для сканирования задаются в начале скрипта, там же можно указать число одновременных потоков и паузу в секундах между циклами. В ходе тестирования диапазона из 512 адресов один поток показал результат в 7 минут, десять потоков справились меньше, чем за минуту. Известные недоработки и баги: • Если ping выдает в качестве ответа что-то вроде "Ответ от XX.XX.XX.XX: Заданная сеть недоступна." - это будет считаться успешным пингом, errorlevel показывает нулевое значение. Обойти это можно, просеивая ответ ping с помощью find, но это неоправданно повысит нагрузку на процессор при большом количестве потоков. UPD: Добавил в скрипт опциональное включение проверки. @Echo Off ::Многопоточный сканер сети на bat ::Anonymous, 2011 ::Начало диапазона Set IPMin=192.168.49.0 ::Конец диапазона Set IPMax=192.168.50.255 ::Число потоков Set Threads=15 ::Таймаут между циклами, сек. Set Timeout=1 ::Тщательная проверка ответа ping ::(Увеличивает время выполнения и повышает нагрузку на процессор) Set UseFind=false For /F "tokens=1,2,3,4 delims=." %%A In ("%IPMin%") Do ( Call :isValid %%A %%B %%C %%D Set MinA=%%A Set MinB=%%B Set MinC=%%C Set MinD=%%D ) For /F "tokens=1,2,3,4 delims=." %%A In ("%IPMax%") Do ( Call :isValid %%A %%B %%C %%D Set MaxA=%%A Set MaxB=%%B Set MaxC=%%C Set MaxD=%%D ) Call :Compare %MinA% %MinB% %MinC% %MinD% %MaxA% %MaxB% %MaxC% %MaxD% If %ErrorLevel%==1 Echo Конечный адрес диапазона меньше начального&Pause&Exit Set A=%MinA%&Set B=%MinB%&Set C=%MinC%&Set D=%MinD% Set /A Timeout+=1 Set Complete=0 If %Threads% LSS 2 GoTo SingleThread Call :CreateThread SetLocal EnableDelayedExpansion :Pinger For /L %%P In (1,1,%Threads%) Do ( Start /B thread.bat !A!.!B!.!C!.!D! Title Сканируем !A!.!B!.!C!.!D!... If !Complete!==1 Echo Сканирование закончено&Pause&Exit Call :Increase If !A!.!B!.!C!.!D!==%MaxA%.%MaxB%.%MaxC%.%MaxD% Set Complete=1 ) Ping -n %Timeout% 127.0.0.1>nul GoTo Pinger :SingleThread If %%UseFind%==true ( ping -n 1 -w 1000 %A%.%B%.%C%.%D%|Find "TTL=">nul ) Else ( ping -n 1 -w 1000 %A%.%B%.%C%.%D%>nul ) If Not %ErrorLevel%==1 (Echo %A%.%B%.%C%.%D%>>ip.log) Title Сканируем %A%.%B%.%C%.%D%... If %Complete%==1 Echo Сканирование закончено&Pause&Exit Call :Increase If %A%.%B%.%C%.%D%==%MaxA%.%MaxB%.%MaxC%.%MaxD% Set Complete=1 GoTo SingleThread :isValid Set IP=%* Set i=0 :Check Set /A i+=1 For /F "tokens=1,*" %%A In ("%IP%") Do ( If %%A GTR 255 Echo Ни один сегмент IP-адреса не может быть больше 255&Pause&Exit If Not "%%B"=="" (Set IP=%%B && Goto Check) ) If Not %i%==4 Echo Проверьте правильность написания IP-адреса&Pause&Exit Exit /B 0 :Compare If %1 GTR %5 (Exit /B 1) Else ( If %2 GTR %6 (Exit /B 1) Else ( If %3 GTR %7 (Exit /B 1) Else ( If %4 GTR %8 (Exit /B 1) ))) If %IPMin%==%IPMax% Echo Начало и конец диапазона совпадают&Pause&Exit Exit /B 0 :Increase Set /A D+=1 If %D% GTR 255 ( Set D=0 Set /A C+=1 ) If %C% GTR 255 ( Set C=0 Set /A B+=1 ) If %B% GTR 255 ( Set B=0 Set /A A+=1 ) If %A% GTR 255 (Exit /B 1) Exit /B 0 :CreateThread Echo @Echo Off>thread.bat If %UseFind%==true ( Echo ping -n 1 -w 1000 %%1^|Find "TTL="^>nul>>thread.bat ) Else ( Echo ping -n 1 -w 1000 %%1^>nul>>thread.bat ) Echo If Not %%ErrorLevel%%==1 (Echo %%1^>^>ip.log)>>thread.bat Echo Exit>>thread.bat Exit /B |
|
Отправлено: 06:35, 03-10-2011 |
Старожил Сообщения: 147
|
Приветствую!
Подскажите пожалуйста, как сделать так, что бы можно было из файла читать диапазоны? Например в txt имеется диапазон: 192.168.1.100 - 192.168.1.200 172.16.3.150 - 172.16.5.250 |
Отправлено: 20:54, 06-08-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 992
|
Профиль | Сайт | Отправить PM | Цитировать парсить строки, сравнивать соответствующие октеты, ну а дальше FOR. однако как по мне, так лучше воспользоваться готовым решением (вот таким, например)
|
Отправлено: 09:28, 07-08-2019 | #3 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
PowerShell - [блог] Многопоточный сканер сети | Xaegr | Скриптовые языки администрирования Windows | 0 | 02-10-2011 21:30 | |
Прочее - сканер в сети | Jdarse | Сетевые технологии | 4 | 19-07-2011 16:35 | |
PowerShell - [блог] Многопоточный сканер сети | Xaegr | Скриптовые языки администрирования Windows | 0 | 12-07-2011 14:30 | |
CMD/BAT - Сканер компьютеров в сети | EnemyBot | Скриптовые языки администрирования Windows | 10 | 20-02-2011 13:09 | |
Сканер сети, ищу | Bugs | Защита компьютерных систем | 5 | 05-09-2006 07:47 |
|