Automātiskais skeneris, lai atrastu aktīvos saimniekus, izmantojot Python

Vai vēlaties redzēt, kādi IP tīkli ir aktīvi? Vai vēlaties uzzināt, kā tiek īstenota šāda stila programma? Nu šodien es jums parādīšu kā izveidot programmu python 3, kas skenēs tīklu IP diapazonā, ko nodrošina lietotājs.

Šim uzdevumam mēs automatizēsim operētājsistēmas pingēšanu.

1. variants - Vienkāršs skeneris


Es ievietoju šo pirmo variantu, jo to ir vieglāk saprast un izpildīt, pirms nonākt pie kaut kā sarežģītāka.

Pilna programma ir šāda:

 importēt os importēt sys importēšanas platformu no datuma un laika importēšanas datuma laika ip = ievade ("Ievadiet IP:") sadalīts ip = ip.split ('.') mēģiniet: sarkans = sadalīts ip [0] + '.' + sadalīts ip [1 ] + '.' + ipDividided [2] + '.' start = int (ievade ("Ievadiet apakštīkla sākuma numuru:")) end = int (ievade ("Ievadiet numuru, kurā vēlaties pārtraukt slaucīšanu:")) izņemot: print ("[!] Kļūda") sys.exit (1) ja (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" starttime = datetime.now () print ("[ * * ] Skenēšana tiek veikta no ", sarkans + str (sākums)," līdz ", sarkans + str (beigas)) apakštīklam diapazonā (sākums, beigas + 1): adrese = sarkana + str (apakštīkls) atbilde = os .popen (ping + "" + adrese) rindai atbildē.readlines (): if ("ttl" in line.lower ()): print (address, "is active") break endtime = datetime.now () laiks = endTime - startTime print ("[*] Skenēšana ilga% s"% laiks) 
[color = # a9a9a9] Pilns kods [/ color]

1. darbība
Mūsu programmai ir jāimportē dažas bibliotēkas:

 importēt os importēt sys importēšanas platformu no datetime importēšanas datetime
[color = # a9a9a9] Bibliotēkas [/ krāsa]

Bibliotēku skaidrojums

  • jūs: Mums tas ir nepieciešams, lai pingētu caur operētājsistēmu.
  • sys: Es to izmantoju, lai pārtrauktu programmu lietotāja ievades kļūdas dēļ.
  • platforma: Tas ļauj mums zināt operētājsistēmu, kurā mēs palaižam programmu, tās izmantošana padara mūs neatkarīgus no platformas.
  • datums Laiks: Es to izmantoju, lai uzzinātu skenēšanas veikšanai nepieciešamo laiku, ja nevēlaties to uzzināt, varat to saglabāt.

2. solis
Turpmākajā koda daļā mēs lūdzam lietotājam nepieciešamos datus, piemēram, resursdatoru un apakštīkla diapazonu. Mums ir arī izmēģinājuma un noķeršanas bloks, kuru es pamatā izmantoju, lai kontrolēti pārtrauktu programmu, ja lietotāja ievietotais IP nav pareizs, pirmā bloka instrukcija parādīs kļūdu un, ja, prasot sākumu un beigās tas neievieto skaitļus, tas pārlēks kļūdu.

 ip = ievade ("Ievadiet IP:") sadalīts ip = ip.split ('.') try: tīkls = sadalīts ip [0] + '.' + sadalīts ip [1] + '.' + sadalīts ip [2 ] + '.' start = int (ievade ("Ievadiet apakštīkla sākuma numuru:")) end = int (ievade ("Ievadiet numuru, kurā vēlaties pārtraukt slaucīšanu:")) izņemot: print ("[!] Kļūda") sys.exit (1)
Es izmantoju pirmo paziņojumu mēģinājuma blokā, lai izveidotu tīkla prefiksu, kas noderēs vēlāk.

Piemēram, nākamajā attēlā ar manis ievietotajiem datiem mēs skenētu, lai noskaidrotu, vai adreses no 192.168.0.190 līdz 192.168.0.199 ir aktīvas.

3. solis
Nākamajā koda daļā es pārbaudu tikai to, kura operētājsistēma tiek izmantota, izmantojot šo funkciju platform.system ().

 ja (platform.system () == "Windows"): ping = "ping -n 1" cits: ping = "ping -c 1"
Tas ir nepieciešams, jo mēs vēlamies nosūtīt vienu paketi, un sistēmā Windows instrukcija tiek veikta ar -n un unix ar -c.

4. solis
Tālāk es analizēšu šādu koda fragmentu:

 starttime = datetime.now () print ("[*] Skenēšana tiek veikta no", sarkans + str (sākums), "līdz", sarkans + str (beigas)) apakštīklam diapazonā (sākums, beigas + 1) : adrese = tīkls + str (apakštīkls) atbilde = os.popen (ping + "" + adrese) rindai atbildē.readlines (): if ("ttl" in line.lower ()): print (address, "is active ") break endtime = datetime.now () time = endtime - starttime print (" [*] Skenēšana ilga% s "% time)
Šis solis ir tas, kur mēs veicam patieso funkcionalitāti, tāpēc pirms darba uzsākšanas es saņemu atbilstošo laiku:
 starttime = datetime.now ()
Mēs krāsojam līniju uz ekrāna, lai lietotājs zinātu, ka tiek veikta skenēšana (un diapazons):
 print ("[*] Skenēšana tiek veikta no", sarkans + str (sākums), "līdz", sarkans + str (beigas))
Tad mēs redzam for, kas iet caur vēlamo IP adrešu diapazonu, tā pirmā instrukcija savieno trūkstošos numurus ar tīkla prefiksu, tas ir, ja mums ir 192.168.0. tad, ja for cilpa iet no 190 līdz 199, pirmo reizi ievadot adresi, tā būs 192.168.0.190, un, progresējot, 190 tiks mainīts, pārējo mēs paturēsim. Tad mēs saņemam ping atbildi, ko veic ar instrukciju:
 os.popen (ping + "" + adrese)
Lai uzzinātu, vai IP ir aktīvs, mēs pārbaudīsim, vai mūsu atbilde satur vārdu ttl, ES izmantoju line.lower () jo šķiet, ka Linux tas iznāk ar mazajiem burtiem un Windows ar lielajiem burtiem, tāpēc mums nav problēmu.

Pēdējā daļā viss, kas man jādara, ir atkal iegūt laiku, un es atpūtu šo jauno laiku ar iepriekšējo, lai apgleznotu laiku, kas bija vajadzīgs manai programmai.

Tālāk es parādīšu programmas izpildes attēlu, jo mēs redzam, ka tas ir nedaudz lēns (52 sekundes 19 adresēm), tas ir atkarīgs arī no datora jaudas, taču šo laiku var uzlabot, ja mēs izmantojam pavedienus, tāpēc tagad Es izveidošu programmu, izmantojot "Python pavedienus".

2. iespēja - vītņots Python skeneris


Tagad mēs sāksim līdzīgu programmu, bet kaut ko sarežģītāku, jo tagad darbs tiks sadalīts starp vairākiem pavedieniem un paliks ne tikai viena slodze, galu galā mēs redzēsim, ka laiks ir ievērojami samazināts, tāpēc mēs varam teikt, ka kura ir optimālāka versija.

Programma ir šāda:

 importēt os importēt sys importēšanas platformu importēt pavedienus, apakšprocesu no datuma un laika importēšanas datuma laika . ' + Sadalīts ip [1] +'. ' + Sadalīts ip [2] +'. ' start = int (ievade ("Ievadiet apakštīkla sākuma numuru:")) end = int (ievade ("Ievadiet numuru, kurā vēlaties pārtraukt slaucīšanu:")) izņemot: print ("[!] Kļūda") sys.exit (1) ja (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" klases pavediens (threading.Thread): def __init __ ( self, start, end): threading. Thread .__ init __ (self) self.start = start self.fin = end def run (self): apakštīklam diapazonā (self.start, self.fin): adrese = tīkls + str (apakštīkla) atbilde = os.popen (ping + "" + adrese) rindai atbildē.readlines (): if ("ttl" in line.lower ()): print (address, "is active") break startTime = datuma laiks. now () print ("[*] Skenēšana tiek veikta no", tīkls + str (sākums), "līdz", tīkls + str (beigas)) NumberIPs = beigu sākuma numursThreads = int ((NumberIPs / IPXHILOS)) threads = [] mēģiniet: i diapazonā (numberThreads): endAux = sākums + IPXTHREADS if (endAux> end): endAux = beigu pavediens = pavediens (sākums, endAux) thread.start () threads.append ( pavediens) sākums = finAux, izņemot Exceptio n so e: print ("[!] Kļūda, veidojot pavedienus:", e) sys.exit (2) pavedienam pavedienos: thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Skenēšana aizņēma% s "% laiku) 
[color = # a9a9a9] Pabeigt programmu [/ color]

Šeit es jums pastāstīšu par instrukcijām, kas mainās un tiek pievienotas (es ignorēšu iepriekšējās programmas daļas):

Iepriekšējā programmā izmantotie importi mums ir derīgi, mums jāpievieno tikai sekojošais, kas tiks izmantots Python pavedieniem.

 importēt pavedienus, apakšprocess
Es izmantoju mainīgo IP skaitam, ko vēlos pārbaudīt katram pavedienam, tāpēc tas tiek pievienots programmas sākumā:
 IPXTHREADS = 4
Lietotāja datu pieprasījums un operētājsistēmas pārbaude paliek neskarta. Šajā izrādē Es izveidoju klasi ar nosaukumu Vītne, kas stiepjas no pavedieniem. Vītne, šī klase kā parametrus saņem adrešu sākumu un beigas, ar kurām būs jāstrādā katram pavedienam, tad man ir palaist funkcija, kas ir nepieciešama un tā ir jāsauc šādi, tā parūpēsies par darba veikšanu, kad mēs sāciet pavedienu vēlāk, for nemainās:
 class Thread (threading.Thread): def __init __ (self, start, end): threading. Thread .__ init __ (self) self.start = start self.fin = end def run (self): apakštīklam diapazonā ( self.start, self.fin): adrese = tīkls + str (apakštīkls) atbilde = os.popen (ping + "" + adrese) rindai atbildē.readlines (): if ("ttl" in line.lower () ): drukāt (adrese, "ir aktīvs") pārtraukums
Tagad mēs izskaidrosim daļu, kas man ir ārpus stundas Vītne.

Es izmantoju šo instrukciju, lai uzzinātu, cik IP man ir kopā, saskaņā ar lietotāja man doto sākumu un beigām:

 NumberIPs = beigu sākums
Tagad, kad mēs to zinām, mēs varam aprēķināt pavedienu skaitu, kas man būs jāstrādā:
 numberThreads = int ((NumberIPs / IPXTHREADS))
Man būs nepieciešams saraksts, kurā glabāt katru pavedienu, lai vēlāk es varētu likt galvenajam pavedienam gaidīt darba beigas:
 pavedieni = []
Šis koda fragments izveidos pavedienus un nodos tiem savu darba sadaļu, tāpēc mums ir jāspēlējas ar katra pavediena sākumu un beigām, tāpēc esmu izveidojis mainīgo finAux. Kad pavediens ir izveidots, tas sākas ar sākt () un tiek pievienots pavedienu sarakstam.
 izmēģiniet: i diapazonā (numberThreads): endAux = sākums + IPXTHREADS if (endAux> beigas): endAux = beigu pavediens = pavediens (sākums, beigas) pavediens.start () pavedieni. pievienot (pavediens) sākums = beigas Aux, izņemot izņēmumu kā e: print ("[!] Kļūda, veidojot pavedienus:", e) sys.exit (2)
Tālāk es izveidoju cilpu, kuras mērķis ir gaidīt pavedienu beigas
 pavedieniem pavedienos: thread.join () 
Visbeidzot, laiks tiek ņemts, tas tiek atņemts no tā, ko paņēmu pirms sākuma, un tas tiek parādīts ekrānā, tāpat kā iepriekšējā programma.

Ja mēs ar šo programmu veicam tādu pašu pārbaudi kā iepriekš, tad redzam, ka viena un tā paša darba veikšanai nepieciešamas 6 sekundes, kāda starpība.

PiezīmeLaiks var atšķirties atkarībā no datora jaudas un mainīgā IPXHILOS, es tam piešķiru 4, ja katram pavedienam piešķirsit vairāk darba, tas prasīs ilgāku laiku, ja tam būs mazāk darba, tas būs ātrāk, taču esiet piesardzīgs. ir ierobežots pavedienu skaits, ko varam izveidot.

Vai mēs varam paļauties, ka šī programma dod mums 100% aktīvo saimnieku?Atbilde ir nē, jo varat bloķēt saimniekdatora ping, bloķējot ICMP pieprasījumus un / vai atbildes, un jūs varat būt pārliecināts, ka, ja tas norāda, ka tas ir aktīvs, tas ir. Ir arī citi skenera veidi, piemēram, TCP, ko varat veikt ar portiem, kurus operētājsistēma parasti atstāj atvērtus, un TCP un ping skeneru kombinācija būs uzticamāka.

Es atstāju jums pasta indeksu ar 2 kodiem:

codigos_ping_python.zip 1.38K 270 lejupielādes

Vai jums patika šī apmācība un palīdzējāt tai?Jūs varat apbalvot autoru, nospiežot šo pogu, lai sniegtu viņam pozitīvu punktu
wave wave wave wave wave