Аутоматски скенер за проналажење активних домаћина са Питхон -ом

Да ли желите да видите који су ИП -ови активни на мрежи? Да ли желите да знате како се изводи програм овог стила? Па данас ћу вам показати како направити програм у питхону 3 који ће скенирати мрежу у низу ИП адреса које корисник пружа.

За овај задатак ћемо аутоматизовати пинг оперативног система.

Опција 1 - Једноставан скенер


Ја сам ставио ову прву опцију, јер је лакше разумети и спровести, пре него што се упустим у нешто компликованије.

Комплетан програм је следећи:

 импорт ос импорт сис платформа за увоз из датетиме увоз датетиме ип = инпут ("Унесите ИП:") подељено ип = ип.сплит ('.') три: ред = подељено ип [0] + '.' + подељено ип [1 ] + '.' + ипДивидед [2] + '.' старт = инт (инпут ("Унесите почетни број подмреже:")) енд = инт (инпут ("Унесите број на којем желите да завршите брисање:")) осим: принт ("[!] Грешка") сис.екит (1) иф (платформ.систем () == "Виндовс"): пинг = "пинг -н 1" елсе: пинг = "пинг -ц 1" старттиме = датетиме.нов () принт ("[ * ] Скенирање се врши од ", црвено + стр (почетак)," до ", црвено + стр (крај)) за подмрежу у опсегу (почетак, крај + 1): адреса = црвено + стр (подмрежа) одговор = ос .попен (пинг + "" + адреса) за ред у одговору.реадлинес (): иф ("ттл" ин лине.ловер ()): принт (адреса, "је активан") енд ендтиме = датетиме.нов () тиме = ендТиме - стартТиме принт ("[*] Скенирање је трајало% с"% време) 
[цолор = # а9а9а9] Потпуни код [/ цолор]

Корак 1
Морамо да увеземо неке библиотеке, за наш програм:

 импорт ос импорт сис платформа за увоз из датетиме импорт датетиме
[цолор = # а9а9а9] Библиотеке [/ цолор]

Објашњење библиотека

  • ти: Треба нам за пинг кроз оперативни систем.
  • сис: Користим га за прекид програма због грешке у корисничком уносу.
  • платформа: Омогућава нам да знамо оперативни систем у којем покрећемо програм, његова употреба нас чини независним од платформе.
  • Датум време: Користим га да знам време потребно за извођење скенирања, ако то не желите знати, можете га сачувати.

Корак 2
У следећем делу кода од корисника тражимо потребне податке, попут хоста и опсега подмреже. Такође имамо блок покушај и хватање који у основи користим за завршетак програма на контролисан начин, ако ИП адреса коју је унео корисник није тачна, прва инструкција блока ће дати грешку, а ако приликом упита за почетак и на крају не убацује бројеве, прескочиће грешку.

 ип = инпут ("Унесите ИП:") подељено ип = ип.сплит ('.') три: нетворк = подељено ип [0] + '.' + подељено ип [1] + '.' + подељено ип [2 ] + '.' старт = инт (инпут ("Унесите почетни број подмреже:")) енд = инт (инпут ("Унесите број на којем желите да завршите брисање:")) осим: принт ("[!] Грешка") сис.екит (1)
Користим прву наредбу у блоку три за креирање мрежног префикса, што ће касније бити корисно.

На пример, на следећој слици са подацима које убацујемо скенирали бисмо да видимо да ли су адресе од 192.168.0.190 до 192.168.0.199 активне.

Корак 3
У следећем делу кода једино проверавам који оперативни систем се користи кроз функцију платформ.систем ().

 иф (платформ.систем () == "Виндовс"): пинг = "пинг -н 1" елсе: пинг = "пинг -ц 1"
Ово је неопходно јер желимо да пошаљемо један пакет, а у оперативном систему Виндовс инструкција се врши помоћу -н, а у униксу са -ц.

Корак 4
Затим ћу анализирати следећи исечак кода:

 старттиме = датетиме.нов () принт ("[*] Скенирање се врши од", ред + стр (почетак), "до", црвено + стр (крај)) за подмрежу у опсегу (почетак, крај + 1) : аддресс = нетворк + стр (субнет) респонсе = ос.попен (пинг + "" + аддресс) фор лине ин респонсе.реадлинес (): иф ("ттл" ин лине.ловер ()): принт (аддресс, "ис ацтиве ") бреак ендтиме = датетиме.нов () тиме = ендтиме - старттиме принт (" [*] Скенирање је трајало% с "% времена)
У овом кораку извршавамо праву функционалност, па пре почетка добијам одговарајуће време:
 старттиме = датетиме.нов ()
И сликамо линију по екрану тако да корисник зна да се скенирање врши (и опсег):
 принт ("[*] Скенирање се врши од", црвено + стр (почетак), "до", црвено + стр (крај))
Затим видимо фор, који ће пролазити кроз распон жељених ИП адреса, његова прва инструкција спаја бројеве који недостају у мрежни префикс, то јест, ако имамо 192.168.0. онда ако фор петља пређе са 190 на 199, први пут када унесете адресу биће 192.168.0.190, а како буде напредовала, 190 ће се мењати, остало задржавамо. Затим добијамо пинг одговор, који се спроводи према упутству:
 ос.попен (пинг + "" + адреса)
Да бисмо знали да ли је ИП активан, проверићемо да ли одговор који имамо садржи реч ттл, Ја користим лине.ловер () јер изгледа да у Линуку излази малим словима, а у Виндовсу великим словима, тако да немамо проблема.

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

Затим показујем слику извођења програма, јер видимо да је донекле спор (52 секунде за 19 адреса), такође зависи од снаге рачунара, али овај пут се може побољшати ако користимо нити, па сада Направићу програм користећи „Питхон нити“.

Опција 2 - Питхон скенер са навојем


Сада ћемо покренути сличан програм, али нешто сложеније, јер ће сада посао бити подељен на неколико нити и неће остати само једно оптерећење, на крају ћемо видети да се време знатно смањило, па можемо рећи што је оптималнија верзија.

Програм је следећи:

 импорт ос импорт сис платформа за увоз импорт тхреадинг, потпроцес од датетиме импорт датетиме ИПКСХИЛОС = 4 ип = инпут ("Унесите ИП:") подељено ип = ип.сплит ('.') три: ред = подељено ип [0] + ' . ' + Подељени ип [1] +'. ' + Подељени ип [2] +'. ' старт = инт (инпут ("Унесите почетни број подмреже:")) енд = инт (инпут ("Унесите број на којем желите да завршите брисање:")) осим: принт ("[!] Грешка") сис.екит (1) иф (платформ.систем () == "Виндовс"): пинг = "пинг -н 1" елсе: пинг = "пинг -ц 1" класа Нит (тхреадинг.Тхреад): деф __инит __ ( селф, старт, енд): тхреадинг.Тхреад .__ инит __ (селф) селф.старт = старт селф.фин = енд деф рун (селф): за подмрежу у домету (селф.старт, селф.фин): адреса = мрежа + стр (подмрежа) одговор = ос.попен (пинг + "" + адреса) за ред у одговору.реадлинес (): иф ("ттл" ин лине.ловер ()): принт (адреса, "је активан") бреак стартТиме = датетиме .нов () принт ("[*] Скенирање се врши од", нетворк + стр (почетак), "до", нетворк + стр (крај)) НумберИПс = крај-почетак нумберТхреадс = инт ((НумберИПс / ИПКСХИЛОС)) нити = [] покушај: за и у опсегу (нумберТхреадс): ендАук = почетак + ИПКСТХРЕАДС иф (ендАук> крај): ендАук = крај нити = Тхреад (почетак, ендАук) тхреад.старт () тхреадс.аппенд ( нит) почетак = финАук осим Екцептио н со е: принт ("[!] Грешка при креирању нити:", е) сис.екит (2) за нит у нитима: тхреад.јоин () ендтиме = датетиме.нов () тиме = ендтиме - старттиме принт ("[ *] Скенирање је трајало% с "% времена) 
[цолор = # а9а9а9] Комплетан програм [/ цолор]

Овде ћу вам рећи о упутствима која се мењају и додају (занемарићу делове једнаке претходном програму):

Увози које користимо у претходном програму важе за нас, потребно је само да додамо следеће, које ће се користити за нити Питхон -а.

 увоз навоја, потпроцес
Користим променљиву за број ИП адреса које желим да свака нит провери, па се додаје на почетку програма:
 ИПКСТХРЕАДС = 4
Захтев корисника за подацима и провера оперативног система остају нетакнути. У овој емисији Креирам класу под називом Тхреад која се протеже од тхреадинг.Тхреад, ова класа прима као параметре почетак и крај адреса са којима ће свака нит морати да ради, затим имам функцију покретања, која је неопходна и мора се овако звати, она ће се побринути за обављање посла када покрени нит касније, фор се не мења:
 цласс Тхреад (тхреадинг.Тхреад): деф __инит __ (селф, старт, енд): тхреадинг.Тхреад .__ инит __ (селф) селф.старт = старт селф.фин = енд деф рун (селф): за подмрежу у опсегу ( селф.старт, селф.фин): адреса = мрежа + стр (подмрежа) одговор = ос.попен (пинг + "" + адреса) за линију у одговору.реадлинес (): иф ("ттл" у линији.ловер () ): принт (адреса, "је активан") прелом
Сада ћемо објаснити део који имам ван часа Тхреад.

Користим следеће упутство да знам укупан број ИП адреса које имам, према почетку и крају који ми корисник даје:

 НумберИПс = крај-почетак
Сада када ово сазнамо, можемо израчунати број нити које ће ми требати за рад:
 нумберТхреадс = инт ((НумберИПс / ИПКСТХРЕАДС))
Требаће ми списак где да сместим сваку нит, тако да касније могу да натерам главну нит да сачека да се посао заврши:
 нити = []
Следећи фрагмент кода ће креирати нити и проследити им њихов радни одељак, за то морамо да се „играмо“ са почетком и крајем сваке нити, зато сам креирао променљиву финАук. Када се нит креира, почиње са почетак () и додаје се на листу нити.
 покушајте: за и у опсегу (нумберТхреадс): ендАук = почетак + ИПКСТХРЕАДС иф (ендАук> крај): ендАук = крај нити = Тхреад (почетак, ендАук) тхреад.старт () тхреадс.аппенд (тхреад) почетак = ендАук осим изузетка као е: принт ("[!] Грешка при креирању нити:", е) сис.екит (2)
Затим креирам петљу чија је сврха чекати да се нити заврше
 за нит у нитима: тхреад.јоин () 
И на крају, потребно је време, одузело би се од оног које сам узео пре почетка и оно се приказује на екрану, баш као и претходни програм.

Ако урадимо исти тест као и раније са овим програмом, видимо да је потребно 6 секунди да се обави исти посао, каква разлика.

БелешкаВреме може да варира у зависности од снаге вашег рачунара и променљиве ИПКСХИЛОС, додељујем јој 4, ако свакој теми доделите више посла, трајаће дуже, ако има мање посла, биће брже, али пазите да тамо је ограничење броја нити које можемо створити.

Можемо ли веровати да нам овај програм даје 100% активних домаћина?Одговор је не, пошто можете блокирати пинг на хосту блокирањем ИЦМП захтева и / или одговора. Оно у шта можете бити сигурни је да ако вам каже да је активан, јесте. Постоје и друге врсте скенера, попут ТЦП -а које можете радити са портовима које оперативни систем обично оставља отвореним, а комбинација ТЦП и пинг скенера биће поузданија.

Остављам вам поштански број са 2 кода:

цодигос_пинг_питхон.зип 1.38К 270 преузимања

Да ли вам се допао и помогао овај водич?Можете наградити аутора притиском на ово дугме да бисте му дали позитиван поен

Ви ће помоћи развој сајта, дељење страницу са пријатељима

wave wave wave wave wave