Automatisk skanner for å finne aktive verter med Python

Vil du se hvilke IP -er som er aktive på et nettverk? Vil du vite hvordan et program av denne stilen utføres? Vel, i dag viser jeg deg hvordan lage et program i python 3 som vil skanne nettverket i en rekke IP -er som brukeren gir.

For denne oppgaven skal vi automatisere pingen til operativsystemet.

valg 1 - Enkel skanner


Jeg satte dette første alternativet, fordi det er lettere å forstå og gjennomføre, før jeg går inn i noe mer komplisert.

Det komplette programmet er som følger:

 import os import sys importplattform fra datetime import datetime ip = input ("Skriv inn IP:") delt ip = ip.split ('.') prøve: red = delt ip [0] + '.' + delt ip [1 ] + '.' + ipDividert [2] + '.' start = int (input ("Skriv inn startnummeret til delnettet:")) end = int (input ("Skriv inn nummeret der du vil avslutte feien:")) unntatt: print ("[!] Error") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" starttime = datetime.now () print ("[ * * ] Skanningen gjøres fra ", rød + str (start)," til ", rød + str (slutt)) for delnett i området (start, slutt + 1): adresse = rød + str (delnett) respons = os .popen (ping + "" + adresse) for linje i response.readlines (): if ("ttl" i line.lower ()): print (adresse, "er aktiv") pause sluttid = datetime.now () tid = endTime - startTime print ("[*] Skanningen varte% s"% tid) 
[color = # a9a9a9] Komplett kode [/ color]

Trinn 1
Vi må importere noen biblioteker for programmet vårt:

 import os import sys import plattform fra datetime import datetime
[color = # a9a9a9] Biblioteker [/ color]

Forklaring til bibliotekene

  • du: Vi trenger det for å pinge gjennom operativsystemet.
  • sys: Jeg bruker den til å avslutte programmet på grunn av en feil i brukerinngangen.
  • plattform: Det lar oss kjenne operativsystemet der vi kjører programmet, dets bruk gjør oss plattformuavhengige.
  • dato tid: Jeg bruker den til å vite hvor lang tid det tar å utføre skanningen. Hvis du ikke vil vite det, kan du lagre den.

Steg 2
I det følgende koden spør vi brukeren om nødvendige data, for eksempel verten og delnettområdet. Vi har også en prøve -og -fang -blokk som jeg i utgangspunktet bruker for å avslutte programmet på en kontrollert måte, hvis IP -en som er satt inn av brukeren ikke er riktig, vil den første instruksjonen i blokken gi en feil, og hvis jeg ber om begynnelsen og slutt det ikke setter inn tall, vil det hoppe en feil.

 ip = input ("Skriv inn IP:") delt ip = ip.split ('.') prøve: nettverk = delt ip [0] + '.' + delt ip [1] + '.' + delt ip [2 ] + '.' start = int (input ("Skriv inn startnummeret til delnettet:")) end = int (input ("Skriv inn nummeret der du vil avslutte feien:")) unntatt: print ("[!] Error") sys.exit (1)
Jeg bruker den første setningen i prøveblokken til å lage et nettverksprefiks, som vil være nyttig senere.

For eksempel i det følgende bildet med dataene jeg setter inn, ville vi skanne for å se om adressene fra 192.168.0.190 til 192.168.0.199 er aktive.

Trinn 3
I den neste delen av koden er det eneste jeg sjekker hvilket operativsystem som brukes gjennom funksjonen platform.system ().

 if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1"
Dette er nødvendig fordi vi ønsker å sende en enkelt pakke, og i Windows er instruksjonene gjort med -n og i unix med -c.

Trinn 4
Deretter vil jeg analysere følgende kodebit:

 starttime = datetime.now () print ("[*] Skanningen utføres fra", rød + str (start), "til", rød + str (slutt)) for delnett i området (start, slutt + 1) : address = network + str (subnet) response = os.popen (ping + "" + address) for line in response.readlines (): if ("ttl" in line.lower ()): print (address, "is active ") break endtime = datetime.now () time = endtime - starttime print (" [*] Skanningen varte% s "% tid)
Dette trinnet er hvor vi utfører den sanne funksjonaliteten, så før jeg starter får jeg tilsvarende tid:
 starttid = datetime.now ()
Og vi maler en linje per skjerm slik at brukeren vet at skanningen utføres (og området):
 print ("[*] Skanningen gjøres fra", rød + str (start), "til", rød + str (slutt))
Deretter ser vi en for, som vil gå gjennom området med ønskede IP -adresser, den første instruksjonen kobler sammen de manglende tallene til nettverksprefikset, det vil si hvis vi har 192.168.0. så hvis for -sløyfen går fra 190 til 199, første gang du skriver inn adressen, vil den være 192.168.0.190, og etter hvert som den går, vil 190 bli endret, resten beholder vi. Så får vi ping -responsen, som utføres av instruksjonen:
 os.popen (ping + "" + adresse)
For å vite om IP -adressen er aktiv, sjekker vi om svaret vi har inneholder ordet ttl, Jeg bruker line.lower () fordi det ser ut til at det i Linux kommer ut med små bokstaver og i Windows i store bokstaver, så vi har ingen problemer.

I den siste delen er alt jeg gjør å få tiden igjen, og jeg hviler denne nye tiden med den forrige for å male tiden det tok for programmet mitt.

Deretter viser jeg et bilde av utførelsen av programmet, som vi kan se er det litt tregt (52 sekunder for 19 adresser) det avhenger også av strømmen til PC -en, men denne gangen kan forbedres hvis vi bruker tråder, så nå Jeg lager programmet ved hjelp av "Python -trådene".

Alternativ 2 - Gjenget Python -skanner


Nå skal vi starte et lignende program, men noe mer komplekst, siden nå vil arbeidet bli delt mellom flere tråder og ikke bare vil en belastning forbli, til slutt vil vi se at tiden er sterkt redusert, så vi kan si som er en mer optimal versjon.

Programmet er som følger:

 import os import sys import plattform import threading, delprosess fra datetime import datetime IPXHILOS = 4 ip = input ("Skriv inn IP:") delt ip = ip.split ('.') prøve: red = delt ip [0] + ' . ' + Delt ip [1] +'. ' + Delt ip [2] +'. ' start = int (input ("Skriv inn startnummeret til delnettet:")) end = int (input ("Skriv inn nummeret der du vil avslutte feien:")) unntatt: print ("[!] Error") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" class Thread (threading.Thread): def __init __ ( self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): for subnet in range (self.start, self.fin): address = network + str (subnet) respons = os.popen (ping + "" + adresse) for linje i response.readlines (): if ("ttl" i line.lower ()): print (adresse, "er aktiv") pause startTime = datetime .now () print ("[*] Skanningen utføres fra", nettverk + str (begynnelse), "til", nettverk + str (slutt)) NumberIPs = end-beginning numberThreads = int ((NumberIPs / IPXHILOS)) threads = [] prøve: for i in range (numberThreads): endAux = begin + IPXTHREADS if (endAux> end): endAux = end thread = Thread (beginning, endAux) thread.start () threads.append ( tråd) begynnelse = finAux unntatt Exceptio n så e: print ("[!] Feil ved opprettelse av tråder:", e) sys.exit (2) for tråd i tråder: thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Skanningen tok% s "% tid) 
[color = # a9a9a9] Komplett program [/ color]

Her skal jeg fortelle deg om instruksjoner som endres og legges til (jeg kommer til å ignorere delene som er lik det forrige programmet):

Importen vi bruker i det forrige programmet er gyldig for oss, vi trenger bare å legge til følgende, som vil bli brukt for Python -trådene.

 importtråd, delprosess
Jeg bruker en variabel for antall IP -er som jeg vil at hver tråd skal sjekke, så den blir lagt til i begynnelsen av programmet:
 IPXTHREADS = 4
Brukerforespørselen om data og kontroll av operativsystemet forblir intakt. I dette showet Jeg lager en klasse som heter Thread som strekker seg fra threading.Thread, denne klassen mottar som parametere start og slutt på adressene som hver tråd må jobbe med, så har jeg en kjørfunksjon, som er nødvendig og må kalles slik, den vil ta seg av arbeidet når vi start tråden senere, for endres ikke:
 class Thread (threading.Thread): def __init __ (self, start, end): threading.Thread .__ init __ (self) start. start = start self.fin = end def run (self): for subnet in range ( self.start, self.fin): address = network + str (subnet) response = os.popen (ping + "" + address) for line in response.readlines (): if ("ttl" in line.lower () ): print (adresse, "er aktiv") pause
Nå skal vi forklare delen jeg har utenfor klassen Tråd.

Jeg bruker følgende instruksjon for å vite antall IP -er jeg har totalt, i henhold til begynnelsen og slutten som brukeren gir meg:

 NumberIPs = sluttstart
Når vi vet dette, kan vi beregne antall tråder jeg trenger for å jobbe:
 numberThreads = int ((NumberIPs / IPXTHREADS))
Jeg trenger en liste hvor jeg skal lagre hver tråd, slik at jeg senere kan få hovedtråden til å vente på at jobben er ferdig:
 tråder = []
Følgende kodefragment skal lage trådene og sende dem deres arbeidsdel, for dette må vi "leke" med begynnelsen og slutten av hver tråd, det er derfor jeg har opprettet variabelen finAux. Når tråden er opprettet begynner den med start () og legges til i trådlisten.
 prøve: for i in range (numberThreads): endAux = begin + IPXTHREADS if (endAux> end): endAux = end thread = Thread (beginning, endAux) thread.start () threads.append (thread) beginning = endAux unntatt Unntak som e: print ("[!] Feil ved opprettelse av tråder:", e) sys.exit (2)
Deretter lager jeg en løkke hvis formål er å vente på at trådene er ferdige
 for tråd i tråder: thread.join () 
Og til slutt, tiden blir tatt, den vil bli trukket fra den jeg tok før jeg begynte, og den vises på skjermen, akkurat som det forrige programmet.

Hvis vi gjør den samme testen som før med dette programmet, ser vi at det tar 6 sekunder å gjøre den samme jobben, hvilken forskjell.

MerkTiden kan variere avhengig av kraften til din PC og variabelen IPXHILOS, jeg tildeler den en 4, hvis du tilordner mer arbeid til hver tråd vil det ta lengre tid, hvis den har mindre arbeid vil det være raskere, men vær forsiktig så det er er en grense for antall tråder vi kan lage.

Kan vi stole på at dette programmet gir oss 100% av de aktive vertene?Svaret er nei, siden du kan blokkere pingen på en vert ved å blokkere ICMP -forespørsler og / eller svar, kan du være sikker på at hvis den forteller deg at den er aktiv, er den det. Det finnes andre typer skannere, for eksempel TCP, som du kan gjøre med portene som et operativsystem normalt lar stå åpne, og kombinasjonen av TCP- og ping -skannere vil være mer pålitelig.

Jeg gir deg en zip med de to kodene:

codigos_ping_python.zip 1,38K 270 Nedlastinger

Likte og hjalp du denne opplæringen?Du kan belønne forfatteren ved å trykke på denne knappen for å gi ham et positivt poeng

Du vil bidra til utvikling av området, dele siden med vennene dine

wave wave wave wave wave