Автоматичен скенер за намиране на активни хостове с Python

Искате ли да видите кои IP адреси са активни в мрежата? Искате ли да знаете как се изпълнява програма от този стил? Е, днес ще ви покажа как да направите програма в python 3, която ще сканира мрежата в редица IP адреси, които потребителят предоставя.

За тази задача ще автоматизираме пинга на операционната система.

Опция 1 - Прост скенер


Поставих тази първа опция, защото е по -лесна за разбиране и изпълнение, преди да се впусна в нещо по -сложно.

Пълната програма е следната:

 import os import sys платформа за импортиране от datetime внос datetime ip = input ("Въведете IP:") разделен ip = ip.split ('.') try: red = разделен ip [0] + '.' + разделен ip [1 ] + '.' + ipDivided [2] + '.' start = int (input ("Въведете началния номер на подмрежата:")) end = int (input ("Въведете номера, където искате да приключите размахването:")) с изключение на: print ("[!] Грешка") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" starttime = datetime.now () print ("[ * ] Сканирането се извършва от ", червено + str (начало)," до ", червено + str (край)) за подмрежа в обхват (начало, край + 1): адрес = червено + str (подмрежа) отговор = os .popen (ping + "" + адрес) за ред в отговор.readlines (): if ("ttl" в line.lower ()): print (адрес, "е активен") break endtime = datetime.now () час = endTime - startTime печат ("[*] Сканирането продължи% s"% време) 
[color = # a9a9a9] Пълен код [/ color]

Етап 1
Трябва да импортираме някои библиотеки за нашата програма:

 import os import sys платформа за импортиране от datetime импортиране datetime
[color = # a9a9a9] Библиотеки [/ color]

Обяснение на библиотеките

  • Вие: Нуждаем се от него за пинг през операционната система.
  • sys: Използвам го за прекратяване на програмата поради грешка при въвеждането от потребителя.
  • платформа: Позволява ни да знаем операционната система, в която изпълняваме програмата, нейното използване ни прави независими от платформата.
  • Време за среща: Използвам го, за да знам времето, необходимо за извършване на сканирането, ако не искате да го знаете, можете да го запишете.

Стъпка 2
В следващата част от кода ние питаме потребителя за необходимите данни, като хост и диапазон на подмрежата. Също така имаме блок за опит и улавяне, който основно използвам за прекратяване на програмата по контролиран начин, ако IP адресът, вмъкнат от потребителя, не е правилен, първата инструкция на блока ще даде грешка и ако при поискване за началото и в края не вмъква числа, ще прескочи грешка.

 ip = вход ("Въведете IP:") разделен ip = ip.split ('.') опит: мрежа = разделен ip [0] + '.' + разделен ip [1] + '.' + разделен ip [2 ] + '.' start = int (input ("Въведете началния номер на подмрежата:")) end = int (input ("Въведете номера, където искате да приключите размахването:")) с изключение на: print ("[!] Грешка") sys.exit (1)
Използвам първото изявление в блока try, за да създам мрежов префикс, който ще бъде полезен по -късно.

Например в следното изображение с вмъкнатите данни бихме сканирали, за да видим дали адресите от 192.168.0.190 до 192.168.0.199 са активни.

Стъпка 3
В следващата част на кода проверявам само коя операционна система се използва чрез функцията platform.system ().

 if (platform.system () == "Windows"): ping = "ping -n 1" иначе: ping = "ping -c 1"
Това е необходимо, защото искаме да изпратим един пакет, а в Windows инструкцията се извършва с -n и в unix с -c.

Стъпка 4
След това ще анализирам следния кодов фрагмент:

 starttime = datetime.now () print ("[*] Сканирането се извършва от", red + str (start), "to", red + str (end)) за подмрежа в обхват (start, end + 1) : адрес = мрежа + str (подмрежа) отговор = os.popen (ping + "" + адрес) за ред в отговор.readlines (): if ("ttl" в line.lower ()): print (адрес, "е active ") break endtime = datetime.now () time = endtime - starttime print (" [*] Сканирането продължи% s "% time)
Тази стъпка е мястото, където изпълняваме истинската функционалност, така че преди да започна получавам съответното време:
 starttime = datetime.now ()
Ние рисуваме ред на екран, така че потребителят да знае, че сканирането се извършва (и диапазона):
 print ("[*] Сканирането се извършва от", red + str (начало), "to", red + str (край))
След това виждаме for, който ще премине през обхвата на желаните IP адреси, първата му инструкция свързва липсващите числа с мрежовия префикс, тоест ако имаме 192.168.0. тогава, ако цикълът for премине от 190 на 199, първият път, когато въведете адреса, той ще бъде 192.168.0.190 и с напредването 190 ще бъде променен, останалото ще запазим. След това получаваме ping отговор, който се изпълнява от инструкцията:
 os.popen (ping + "" + адрес)
За да разберем дали IP е активен, ще проверим дали отговорът, който имаме, съдържа думата ttl, Използвам line.lower () защото изглежда, че в Linux излиза с малки букви, а в Windows с главни букви, така че нямаме проблеми.

В последната част всичко, което правя, е да получа отново време и да почивам това ново време с предишното, за да нарисувам времето, необходимо за моята програма.

След това показвам изображение на изпълнението на програмата, тъй като можем да видим, че е малко бавно (52 секунди за 19 адреса), също зависи от мощността на компютъра, но този път може да се подобри, ако използваме нишки, така че сега Ще направя програмата, използвайки "нишките на Python".

Вариант 2 - Threaded Python скенер


Сега ще стартираме подобна програма, но нещо по -сложно, тъй като сега работата ще бъде разделена между няколко нишки и не само ще остане едно зареждане, в крайна сметка ще видим, че времето е значително намалено, така че можем да кажем което е по -оптималната версия.

Програмата е следната:

 import os import sys платформа за импортиране импортиране на нишки, подпроцес от datetime импортиране datetime IPXHILOS = 4 ip = вход ("Въведете IP:") разделен ip = ip.split ('.') try: red = разделен ip [0] + ' . ' + Разделен ip [1] +'. ' + Разделен ip [2] +'. ' start = int (input ("Въведете началния номер на подмрежата:")) end = int (input ("Въведете номера, където искате да приключите размахването:")) с изключение на: print ("[!] Грешка") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" клас Нишка (threading.Thread): def __init __ ( self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): за подмрежа в обхват (self.start, self.fin): адрес = мрежа + str (подмрежа) отговор = os.popen (ping + "" + адрес) за ред в отговор.readlines (): if ("ttl" в line.lower ()): print (адрес, "е активен") break startTime = datetime .now () print ("[*] Сканирането се извършва от", network + str (начало), "до", мрежа + str (край)) NumberIPs = крайно начално числоThreads = int ((NumberIPs / IPXHILOS)) нишки = [] опит: за i в обхват (numberThreads): endAux = начало + IPXTHREADS if (endAux> край): endAux = край нишка = нишка (начало, endAux) thread.start () threads.append ( нишка) начало = finAux с изключение на Exceptio n so e: print ("[!] Грешка при създаването на нишки:", e) sys.exit (2) за нишка в нишки: thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Сканирането отне% s "% време) 
[color = # a9a9a9] Пълна програма [/ color]

Тук ще ви разкажа за инструкциите, които се променят и добавят (ще игнорирам частите, равни на предишната програма):

Импортирането, което използваме в предишната програма, е валидно за нас, трябва само да добавим следното, което ще се използва за нишките на Python.

 импортиране на нишки, подпроцес
Използвам променлива за броя на IP адресите, които искам всяка нишка да проверява, така че се добавя в началото на програмата:
 IPXTHREADS = 4
Искането на потребителя за данни и проверката на операционната система остават непокътнати. В това шоу Създавам клас, наречен Thread, който се простира от threading.Thread, този клас получава като параметри началото и края на адресите, с които всяка нишка ще трябва да работи, след това имам функция за изпълнение, която е необходима и трябва да бъде извикана така, тя ще се погрижи да свърши работата, когато ние стартирайте нишката по -късно, for не се променя:
 class Thread (threading.Thread): def __init __ (self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): за подмрежа в обхват ( self.start, self.fin): адрес = мрежа + str (подмрежа) отговор = os.popen (ping + "" + адрес) за ред в отговор.readlines (): if ("ttl" в line.lower () ): print (адрес, "е активен") прекъсване
Сега ще обясним частта, която имам извън класа Конец.

Използвам следната инструкция, за да знам броя на IP адресите, които имам общо, в зависимост от началото и края, които потребителят ми дава:

 NumberIPs = краен старт
След като разберем това, можем да изчислим броя нишки, които ще ми трябват за работа:
 numberThreads = int ((NumberIPs / IPXTHREADS))
Ще ми трябва списък, където да съхранявам всяка нишка, за да мога по -късно да накарам основната нишка да изчака работата да завърши:
 нишки = []
Следният кодов фрагмент ще създаде нишките и ще им предаде работния им раздел, за това трябва да „играем“ с началото и края на всяка нишка, затова създадох променливата finAux. След като нишката е създадена, тя започва с начало () и се добавя към списъка с нишки.
 опитайте: за i в обхват (numberThreads): endAux = начало + IPXTHREADS if (endAux> край): endAux = край нишка = нишка (начало, endAux) thread.start () threads.append (thread) начало = endAux с изключение на изключение като e: print ("[!] Грешка при създаването на теми:", e) sys.exit (2)
След това създавам цикъл, чиято цел е да изчака нишките да завършат
 за нишка в нишки: thread.join () 
И накрая, времето е взето, то ще бъде извадено от това, което взех преди стартиране и се показва на екрана, точно както предишната програма.

Ако направим същия тест като преди с тази програма, виждаме, че отнема 6 секунди, за да свърши същата работа, каква разлика.

ЗабележкаВремето може да варира в зависимост от мощността на вашия компютър и променливата IPXHILOS, аз му присвоявам 4, ако зададете повече работа за всяка нишка, това ще отнеме повече време, ако има по -малко работа, ще бъде по -бързо, но внимавайте, че има е ограничение за броя на нишките, които можем да създадем.

Можем ли да се доверим, че тази програма ни дава 100% от активните хостове?Отговорът е не, тъй като можете да блокирате пинг на хост, като блокирате ICMP заявки и / или отговори, това, в което можете да сте сигурни, е, че ако ви каже, че е активен, това е така. Има и други видове скенери, като TCP, които можете да правите с портовете, които операционната система обикновено оставя отворени, а комбинацията от TCP и ping скенери ще бъде по -надеждна.

Оставям ви цип с 2 кода:

codigos_ping_python.zip 1.38K 270 изтегляния

Хареса ли ви и помогнахте на този урок?Можете да възнаградите автора, като натиснете този бутон, за да му дадете положителна точка

Така ще помогнете за развитието на сайта, сподели с приятелите си

wave wave wave wave wave