Automatski skener za pronalaženje aktivnih domaćina s Pythonom

Želite li vidjeti koji su IP -ovi aktivni na mreži? Želite li znati kako se izvodi program ovog stila? Pa danas ću vam pokazati kako napraviti program u pythonu 3 koji će skenirati mrežu u nizu IP adresa koje korisnik pruža.

Za ovaj ćemo zadatak automatizirati ping operacijskog sustava.

opcija 1 - Jednostavan skener


Ja sam stavio ovu prvu opciju, jer ju je lakše razumjeti i izvesti, prije nego što se upustim u nešto složenije.

Kompletan program je sljedeći:

 import os import sys platforma za uvoz iz datetime uvoz datetime ip = input ("Unesite IP:") podijeljen ip = ip.split ('.') try: red = podijeljen ip [0] + '.' + podijeljen ip [1 ] + '.' + ipDivided [2] + '.' start = int (input ("Unesite početni broj podmreže:")) end = int (input ("Unesite broj na kojem želite završiti brisanje:")) osim: print ("[!] Greška") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" starttime = datetime.now () print ("[ * ] Skeniranje se vrši od ", crveno + str (početak)," do ", crveno + str (kraj)) za podmrežu u rasponu (početak, kraj + 1): adresa = crveno + str (podmreža) odgovor = os .popen (ping + "" + adresa) za redak u odgovoru.readlines (): if ("ttl" u retku.lower ()): ispis (adresa, "aktivan") break endtime = datetime.now () vrijeme = endTime - startTime ispis ("[*] Skeniranje je trajalo% s"% vrijeme) 
[color = # a9a9a9] Potpuni kôd [/ color]

Korak 1
Moramo uvesti neke knjižnice, za naš program:

 import os import sys platforma za uvoz iz datetime import datetime
[color = # a9a9a9] Knjižnice [/ color]

Objašnjenje knjižnica

  • vas: Treba nam za ping kroz operacijski sustav.
  • sys: Koristim ga za prekid programa zbog pogreške u korisničkom unosu.
  • platforma: Omogućuje nam da znamo operacijski sustav na kojem pokrećemo program, njegova upotreba nas čini nezavisnima od platforme.
  • Datum vrijeme: Koristim ga da znam vrijeme potrebno za izvođenje skeniranja, ako to ne želite znati, možete ga spremiti.

Korak 2
U sljedećem dijelu koda od korisnika tražimo potrebne podatke, poput hosta i raspona podmreže. Također imamo pokušaj i ulov blok koji u osnovi koristim za prekidanje programa na kontroliran način, ako IP adresa koju je umetnuo korisnik nije točna, prva uputa u bloku će dati pogrešku, a ako prilikom upita za početak i na kraju ne umeće brojeve, preskočit će pogrešku.

 ip = input ("Unesite IP:") podijeljen ip = ip.split ('.') try: network = podijeljen ip [0] + '.' + podijeljen ip [1] + '.' + podijeljen ip [2 ] + '.' start = int (input ("Unesite početni broj podmreže:")) end = int (input ("Unesite broj na kojem želite završiti brisanje:")) osim: print ("[!] Greška") sys.exit (1)
Koristim prvu naredbu u bloku try za stvaranje mrežnog prefiksa, što će kasnije biti korisno.

Na primjer, na sljedećoj slici s podacima koje unosim skenirali bismo da vidimo jesu li adrese od 192.168.0.190 do 192.168.0.199 aktivne.

Korak 3
U sljedećem dijelu koda jedino provjeravam koji operativni sustav se koristi kroz funkciju platforma.system ().

 if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1"
To je potrebno jer želimo poslati jedan paket, a u sustavu Windows upute se izvode s -n, a u unixu s -c.

Korak 4
Zatim ću analizirati sljedeći isječak koda:

 starttime = datetime.now () print ("[*] Skeniranje se vrši od", red + str (početak), "do", crveno + str (kraj)) za podmrežu u rasponu (početak, kraj + 1) : adresa = mreža + str (podmreža) odgovor = os.popen (ping + "" + adresa) za redak u odgovoru.readlines (): if ("ttl" u retku.lower ()): ispis (adresa, "je active ") break endtime = datetime.now () time = endtime - starttime print (" [*] Skeniranje je trajalo% s "% vrijeme)
U ovom koraku provodimo pravu funkcionalnost, pa prije početka dobivam odgovarajuće vrijeme:
 starttime = datetime.now ()
I bojimo liniju po ekranu tako da korisnik zna da se skeniranje vrši (i raspon):
 print ("[*] Skeniranje se vrši od", crveno + str (početak), "do", crveno + str (kraj))
Zatim vidimo for, koji će prolaziti kroz raspon željenih IP adresa, njegova prva instrukcija spaja nedostajuće brojeve u mrežni prefiks, odnosno ako imamo 192.168.0. tada, ako for petlja ide od 190 do 199, prvi put kada unesete adresu bit će 192.168.0.190, a kako napreduje 190 će se mijenjati, ostalo zadržavamo. Tada dobivamo ping odgovor, koji se izvodi prema uputama:
 os.popen (ping + "" + adresa)
Da bismo znali je li IP aktivan, provjerit ćemo sadrži li odgovor koji imamo riječ ttl, Koristim line.lower () jer se čini da u Linuxu izlazi malim, a u Windowsu velikim slovima, tako da nemamo problema.

U posljednjem dijelu, sve što moram učiniti je ponovno dobiti vrijeme i odmoriti ovo novo vrijeme s prethodnim kako bih oslikao vrijeme potrebno za moj program.

Zatim pokazujem sliku izvođenja programa, jer vidimo da je donekle spor (52 sekunde za 19 adresa), također ovisi o snazi ​​računala, ali ovaj put se može poboljšati ako koristimo niti, pa sada Program ću izraditi pomoću "niti Pythona".

Opcija 2 - Python skener s navojem


Sada ćemo pokrenuti sličan program, ali nešto složenije, jer će sada posao biti podijeljen na nekoliko niti i neće ostati samo jedno opterećenje, na kraju ćemo vidjeti da se vrijeme jako smanjilo, pa možemo reći što je optimalnija verzija.

Program je sljedeći:

 import os import sys platforma za uvoz import threading, potproces od datetime import datetime IPXHILOS = 4 ip = input ("Unesite IP:") podijeljen ip = ip.split ('.') try: red = podijeljen ip [0] + ' . ' + Podijeljeni ip [1] +'. ' + Podijeljeni ip [2] +'. ' start = int (input ("Unesite početni broj podmreže:")) end = int (input ("Unesite broj na kojem želite završiti brisanje:")) osim: print ("[!] Greška") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" klasa Nit (threading.Thread): def __init __ ( self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): za podmrežu u rasponu (self.start, self.fin): adresa = mreža + str (podmreža) odgovor = os.popen (ping + "" + adresa) za redak u odgovoru.readlines (): if ("ttl" u retku.lower ()): ispis (adresa, "je aktivan") break startTime = datetime .now () print ("[*] Skeniranje se vrši od", network + str (početak), "do", network + str (kraj)) NumberIPs = kraj-početak numberThreads = int ((NumberIPs / IPXHILOS)) niti = [] pokušaj: za i u rasponu (numberThreads): endAux = početak + IPXTHREADS if (endAux> kraj): endAux = kraj niti = Nit (početak, endAux) thread.start () threads.append ( nit) početak = finAux osim Exceptio n so e: print ("[!] Pogreška pri stvaranju niti:", e) sys.exit (2) za nit u nitima: thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Skeniranje je trajalo% s "% vremena) 
[color = # a9a9a9] Cijeli program [/ color]

Ovdje ću vam reći o uputama koje se mijenjaju i dodaju (zanemarit ću dijelove jednake prethodnom programu):

Uvozi koje koristimo u prethodnom programu vrijede za nas, potrebno je samo dodati sljedeće, koje će se koristiti za niti Pythona.

 uvoz navoja, podproces
Koristim varijablu za broj IP adresa koje želim provjeriti u svakoj niti, pa se dodaje na početku programa:
 IPXTHREADS = 4
Korisnički zahtjev za podacima i provjera operacijskog sustava ostaju netaknuti. U ovoj emisiji Stvaram klasu pod nazivom Thread koja se proteže od threading.Thread, ova klasa prima kao parametre početak i kraj adresa s kojima će svaka nit morati raditi, tada imam funkciju pokretanja, koja je neophodna i mora se zvati ovako, ona će se pobrinuti za obavljanje posla kada pokreni nit kasnije, for se ne mijenja:
 class Thread (threading.Thread): def __init __ (self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): za podmrežu u rasponu ( self.start, self.fin): adresa = mreža + str (podmreža) odgovor = os.popen (ping + "" + adresa) za redak u odgovoru.readlines (): if ("ttl" u retku.lower () ): ispis (adresa, "aktivan je") prijelom
Sada ćemo objasniti dio koji imam izvan razreda Nit.

Koristim sljedeće upute da znam ukupan broj IP adresa koje imam, prema početku i kraju koje mi korisnik daje:

 NumberIPs = kraj-početak
Sada kad to saznamo, možemo izračunati broj niti koje će mi trebati za rad:
 numberThreads = int ((NumberIPs / IPXTHREADS))
Trebat će mi popis gdje pohraniti svaku nit, tako da kasnije mogu natjerati glavnu nit da čeka da posao završi:
 niti = []
Sljedeći fragment koda će stvoriti niti i proslijediti im njihov odjeljak rada, za to se moramo "igrati" s početkom i krajem svake niti, zato sam stvorio varijablu finAux. Nakon što se nit stvori počinje s početak () i dodaje se na popis niti.
 pokušajte: za i u rasponu (numberThreads): endAux = početak + IPXTHREADS if (endAux> kraj): endAux = kraj niti = nit (početak, endAux) thread.start () threads.append (thread) početak = endAux osim iznimke kao e: print ("[!] Pogreška pri stvaranju niti:", e) sys.exit (2)
Zatim stvaram petlju čija je svrha pričekati da se niti završe
 za nit u nitima: thread.join () 
I na kraju, vrijeme je uzeto, oduzelo bi se od onog koje sam uzeo prije početka i ono se prikazuje na ekranu, baš kao i prethodni program.

Ako napravimo isti test kao i dosad s ovim programom, vidimo da je potrebno 6 sekundi za obavljanje istog posla, kakva je razlika.

BilješkaVrijeme može varirati ovisno o snazi ​​vašeg računala i varijabli IPXHILOS, dodjeljujem mu 4, ako svakoj niti dodijelite više posla, trajat će duže, ako ima manje posla, bit će brže, ali pazite da tamo je ograničenje broja niti koje možemo stvoriti.

Možemo li vjerovati da nam ovaj program daje 100% aktivnih domaćina?Odgovor je ne, budući da ping na hostu možete blokirati blokiranjem ICMP zahtjeva i / ili odgovora, možete biti sigurni da ako vam kaže da je aktivan, jest. Postoje i druge vrste skenera, poput TCP -a koje možete raditi s priključcima koje operacijski sustav obično ostavlja otvorenim, a kombinacija TCP i ping skenera bit će pouzdanija.

Ostavljam vam poštanski broj sa 2 koda:

codigos_ping_python.zip 1,38K 270 preuzimanja

Je li vam se svidio i pomogao ovaj vodič?Autor možete nagraditi pritiskom na ovaj gumb kako biste mu dali pozitivan bod

Vi ćete pomoći u razvoju web stranice, dijeljenje stranicu sa svojim prijateljima

wave wave wave wave wave