Automatinis skaitytuvas, skirtas surasti aktyvius kompiuterius naudojant „Python“

Ar norėtumėte pamatyti, kokie IP yra aktyvūs tinkle? Ar norėtumėte sužinoti, kaip vykdoma tokio stiliaus programa? Na šiandien aš tau parodysiu kaip sukurti programą „python 3“, kuri nuskaitys tinklą naudotojo pateiktame IP diapazone.

Atlikdami šią užduotį, mes automatizuosime operacinės sistemos ping.

1 variantas - Paprastas skaitytuvas


Aš siūlau šį pirmąjį variantą, nes jį lengviau suprasti ir įgyvendinti prieš pradedant kažką sudėtingesnio.

Visa programa yra tokia:

 importuoti os importuoti sys importavimo platformą iš datos ir laiko importo datos laiko ip = input ("Enter the IP:") padalintas ip = ip.split ('.') try: red = split ip [0] + '.' + padalintas ip [1 ] + '.' + ipDividided [2] + '.' start = int (įvestis ("Įveskite potinklio pradžios numerį:")) end = int (įvestis ("Įveskite numerį, kuriame norite baigti valymą:")) išskyrus: print ("[!] Klaida") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" starttime = datetime.now () print ("[ * * ] Nuskaitymas atliekamas iš ", raudona + str (pradžia)," iki ", raudona + str (pabaiga)), kai potinkis yra diapazone (pradžia, pabaiga + 1): adresas = raudona + str (potinklis) atsakymas = os .popen (ping + "" + adresas) eilutei atsakant.readlines (): if ("ttl" in line.lower ()): print (address, "is active") break endtime = datetime.now () time = endTime - startTime print ("[*] Nuskaitymas truko% s"% laiko) 
[color = # a9a9a9] Visas kodas [/ color]

1 žingsnis
Turime importuoti kai kurias mūsų programos bibliotekas:

 importuoti os importuoti sys importavimo platformą iš datetime import data datetime
[color = # a9a9a9] Bibliotekos [/ spalva]

Bibliotekų paaiškinimas

  • tu: Mums reikia, kad jis būtų rodomas naudojant operacinę sistemą.
  • sys: Naudoju jį programai nutraukti dėl vartotojo įvesties klaidos.
  • platforma: Tai leidžia mums žinoti operacinę sistemą, kurioje vykdome programą, jos naudojimas daro mus nepriklausomais nuo platformos.
  • datų laikas: Aš naudoju jį norėdamas sužinoti, kiek laiko reikia nuskaitymui atlikti, jei nenorite to žinoti, galite jį išsaugoti.

2 žingsnis
Kitame kodo fragmente prašome vartotojo pateikti reikiamus duomenis, pvz., Pagrindinį kompiuterį ir potinklio diapazoną. Taip pat turime bandomąjį blokuoti bloką, kurį iš esmės naudoju norėdamas nutraukti programą valdomu būdu, jei vartotojo įvestas IP neteisingas, pirmoji bloko instrukcija duos klaidą, o jei klausiant pradžios ir pabaigoje jis neįterpia skaičių, tai peršoks klaidą.

 ip = įvestis ("Įveskite IP:") padalinta ip = ip.split ('.') pabandykite: tinklas = padalintas ip [0] + '.' + padalintas ip [1] + '.' + padalintas ip [2 ] + '.' start = int (įvestis ("Įveskite potinklio pradžios numerį:")) end = int (įvestis ("Įveskite numerį, kuriame norite baigti valymą:")) išskyrus: print ("[!] Klaida") sys.exit (1)
Aš naudoju pirmąjį bandymo bloko teiginį, norėdamas sukurti tinklo priešdėlį, kuris bus naudingas vėliau.

Pavyzdžiui, šiame paveikslėlyje su įterptais duomenimis mes nuskaitytume, ar adresai nuo 192.168.0.190 iki 192.168.0.199 yra aktyvūs.

3 žingsnis
Kitoje kodo dalyje tikrinu tik tai, kuri operacinė sistema naudojama naudojant šią funkciją platform.system ().

 if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1"
Tai būtina, nes norime siųsti vieną paketą, o sistemoje „Windows“ instrukcija atliekama naudojant –n, o unix -su –c.

4 žingsnis
Toliau analizuosiu šį kodo fragmentą:

 starttime = datetime.now () print ("[*] Nuskaitymas atliekamas nuo", raudona + str (pradžia), "iki", raudona + str (pabaiga)), kai potinklis yra diapazone (pradžia, pabaiga + 1) : adresas = tinklas + str (potinklis) atsakymas = os.popen (ping + "" + adresas) eilutei atsakant.readlines (): if ("ttl" in line.lower ()): print (address, "is active ") break endtime = datetime.now () time = endtime - timetime print (" [*] Nuskaitymas truko% s "% time)
Šiame etape mes atliekame tikrąsias funkcijas, todėl prieš pradėdamas gaunu atitinkamą laiką:
 starttime = datetime.now ()
Mes nudažome liniją kiekviename ekrane, kad vartotojas žinotų, kad nuskaitymas atliekamas (ir diapazonas):
 print ("[*] Nuskaitymas atliekamas iš", raudona + str (pradžia), "iki", raudona + str (pabaiga))
Tada matome for, kuris eis per norimų IP adresų diapazoną, jo pirmoji instrukcija sujungia trūkstamus skaičius į tinklo priešdėlį, tai yra, jei turime 192.168.0. tada, jei for ciklas eina nuo 190 iki 199, pirmą kartą įvedus adresą, jis bus 192.168.0.190, o progresuojant 190 bus pakeistas, o likusi dalis lieka. Tada mes gauname ping atsakymą, kuris vykdomas pagal instrukciją:
 os.popen (ping + "" + adresas)
Norėdami sužinoti, ar IP yra aktyvus, patikrinsime, ar atsakyme yra žodis ttl, Aš naudoju line.lower () nes atrodo, kad „Linux“ jis pateikiamas mažosiomis raidėmis, o „Windows“ - didžiosiomis raidėmis, todėl problemų neturime.

Paskutinėje dalyje aš tik vėl gaunu laiko ir šį naują laiką ilsiuosi su ankstesniu, kad nupieščiau laiką, kurio prireikė mano programai.

Toliau parodysiu programos vykdymo vaizdą, nes matome, kad jis yra šiek tiek lėtas (52 sekundės 19 adresų), taip pat priklauso nuo kompiuterio galios, tačiau šį laiką galima pagerinti, jei naudosime gijas, todėl dabar Aš sudarysiu programą naudodamas „Python“ gijas.

2 variantas - srieginis „Python“ skaitytuvas


Dabar ketiname pradėti panašią programą, bet kažką sudėtingesnio, nes dabar darbas bus padalytas į kelias temas ir ne tik liks viena apkrova, galų gale pamatysime, kad laikas labai sutrumpėja, todėl galime pasakyti, kad kuri yra optimali versija.

Programa yra tokia:

 importas os importas sys importavimo platforma importavimo sriegis, papildomas procesas iš datos ir laiko importavimo datos laiko . ' + Padalinta ip [1] +'. ' + Padalinta ip [2] +'. ' start = int (įvestis ("Įveskite potinklio pradžios numerį:")) end = int (įvestis ("Įveskite numerį, kuriame norite baigti valymą:")) išskyrus: print ("[!] Klaida") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" klasės siūlas (threading.Thread): def __init __ ( self, start, end): threading. Thread .__ init __ (self) self.start = start self.fin = end def run run (self): potinkliui diapazone (self.start, self.fin): adresas = tinklas + str (potinklio) atsakymas = os.popen (ping + "" + adresas) eilutei atsakant. skaitymo eilutės (): jei ("ttl" eilutėje. apatinis ()): spausdinti (adresas, "yra aktyvus") pertrauka startTime = datetime .now () print ("[*] Nuskaitymas atliekamas iš", tinklas + str (pradžia), "iki", tinklas + str (pabaiga)) NumberIPs = pabaigos-pradžios skaičiusThreads = int ((NumberIPs / IPXHILOS)) threads = [] pabandykite: i diapazone (numberThreads): endAux = pradžia + IPXTHREADS if (endAux> end): endAux = end thread = Thread (algus, endAux) thread.start () threads.append ( siūlas) pradžia = finAux, išskyrus Exceptio n so e: print ("[!] Klaida kuriant gijas:", e) sys.exit (2) gijai gijose: thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Nuskaitymas užtruko% s "% laiko) 
[color = # a9a9a9] Užbaikite programą [/ color]

Čia aš jums papasakosiu apie instrukcijas, kurios keičiasi ir yra pridėtos (nekreipiu dėmesio į ankstesnei programai lygias dalis):

Importas, kurį naudojame ankstesnėje programoje, galioja mums, mums tereikia pridėti šiuos elementus, kurie bus naudojami „Python“ gijoms.

 importuoti sriegimą, papildomas procesas
Aš naudoju kintamąjį IP skaičiui, kurį noriu patikrinti kiekvienoje temoje, todėl jis pridedamas programos pradžioje:
 IPXTHREADS = 4
Vartotojo duomenų užklausa ir operacinės sistemos patikrinimas lieka nepakitę. Šioje laidoje Aš sukuriu klasę pavadinimu „Thread“, kuri tęsiasi nuo sriegimo, ši klasė kaip parametrus gauna adresų, su kuriais kiekviena gija turės veikti, pradžią ir pabaigą, tada aš turiu paleidimo funkciją, kuri yra būtina ir turi būti vadinama taip, ji pasirūpins, kad atliktume darbą, kai pradėk temą vėliau, for nesikeis:
 class Thread (threading.Thread): def __init __ (self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): potinkliui diapazone ( self.start, self.fin): adresas = tinklas + str (potinklis) atsakymas = os.popen (ping + "" + adresas) eilutei atsakant.readlines (): if ("ttl" in line.lower () ): spausdinti (adresas, "yra aktyvus") pertrauka
Dabar mes paaiškinsime tą dalį, kurią turiu už pamokų ribų Siūlai.

Aš naudoju šią instrukciją norėdamas sužinoti IP turimų IP skaičių, atsižvelgiant į vartotojo pradžią ir pabaigą:

 NumberIPs = pabaiga-pradžia
Dabar, kai tai žinome, galime apskaičiuoti siūlų, kuriuos man reikės dirbti, skaičių:
 numberThreads = int ((NumberIPs / IPXTHREADS))
Man reikės sąrašo, kur laikyti kiekvieną temą, kad vėliau galėčiau priversti pagrindinę giją laukti, kol baigsis darbas:
 temos = []
Šis kodo fragmentas sukurs siūlus ir perduos jiems savo darbo skyrių, todėl turime „žaisti“ su kiekvienos gijos pradžia ir pabaiga, todėl sukūriau kintamąjį finAux. Sukūrus siūlą, jis prasideda pradėti () ir įtraukiamas į temų sąrašą.
 pabandykite: jei aš diapazone (skaičius e: print ("[!] Klaida kuriant temas:", e) sys.exit (2)
Toliau sukuriu kilpą, kurios tikslas yra palaukti, kol baigsis siūlai
 siūlams siūluose: thread.join () 
Galiausiai, laikas yra atimamas iš to, kurį paėmiau prieš pradėdamas, ir jis rodomas ekrane, kaip ir ankstesnė programa.

Jei atliksime tą patį testą kaip ir anksčiau su šia programa, pamatysime, kad tam pačiam darbui atlikti reikia 6 sekundžių, koks skirtumas.

PastabaLaikas gali skirtis priklausomai nuo jūsų kompiuterio galios ir kintamojo IPXHILOS, aš jam priskiriu 4, jei kiekvienai gijai priskiriate daugiau darbo, tai užtruks ilgiau, jei bus mažiau darbo, tai bus greičiau, tačiau būkite atsargūs apribojame siūlomų temų skaičių.

Ar galime pasitikėti, kad ši programa suteikia mums 100% aktyvių šeimininkų?Atsakymas yra neigiamas, nes galite užblokuoti pagrindiniame kompiuteryje esantį „ping“ užblokuodami ICMP užklausas ir (arba) atsakymus, todėl galite būti tikri, kad jei jis jums pasakys, kad jis yra aktyvus, tai yra. Yra ir kitų tipų skaitytuvų, pvz., TCP, kuriuos galite padaryti naudodami prievadus, kuriuos operacinė sistema paprastai palieka atvirus, o TCP ir „ping“ skaitytuvų derinys bus patikimesnis.

Palieku jums pašto kodą su 2 kodais:

codigos_ping_python.zip 1.38K 270 atsisiuntimų

Ar jums patiko ir padėjo ši pamoka?Galite apdovanoti autorių paspausdami šį mygtuką, kad suteiktumėte jam teigiamą tašką

Padėsite svetainės plėtrą, dalintis puslapį su draugais

wave wave wave wave wave