Python ile aktif ana bilgisayarları bulmak için otomatik tarayıcı

Bir ağda hangi IP'lerin etkin olduğunu görmek ister misiniz? Bu tarz bir programın nasıl yürütüldüğünü bilmek ister misiniz? Peki bugün sana gösteriyorum python 3'te ağı tarayacak bir program nasıl yapılır kullanıcının sağladığı bir dizi IP'de.

Bu görev için işletim sisteminin pingini otomatikleştireceğiz.

seçenek 1 - Basit tarayıcı


Bu ilk seçeneği koydum çünkü daha karmaşık bir şeye girmeden önce anlaşılması ve uygulanması daha kolay.

Programın tamamı aşağıdaki gibidir:

 import os import sys import platform from datetime import datetime ip = giriş ("IP'yi girin:") bölünmüş ip = ip.split ('.') deneyin: kırmızı = bölünmüş ip [0] + '.' + bölünmüş ip [1 ] + ' .'+ ipDivided [2] +'. ' start = int (input ("Alt ağın başlangıç ​​numarasını girin:")) end = int (input ("Süpürmeyi bitirmek istediğiniz sayıyı girin:")) hariç: print ("[!] Hata") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" başka: ping = "ping -c 1" starttime = datetime.now () print ("[ * ] Tarama, aralıktaki (başlangıç, bitiş + 1) alt ağ için ", kırmızı + str (başlangıç)," ila ", kırmızı + str (bitiş)) arasında yapılıyor: adres = kırmızı + str (alt ağ) yanıtı = os .popen (ping + "" + adres) in response.readlines (): if ("ttl" in line.lower ()): print (adres, "etkin") break bitiş zamanı = datetime.now () time = endTime - startTime yazdırma ("[*] Tarama % s "% süre sürdü) 
[color = # a9a9a9] Kodu tamamlayın [/ color]

Aşama 1
Programımız için bazı kütüphaneleri içe aktarmamız gerekiyor:

 import os import sys import platform from datetime import datetime
[color = # a9a9a9] Kitaplıklar [/ color]

Kütüphanelerin açıklaması

  • sen: İşletim sistemine ping atmak için buna ihtiyacımız var.
  • sistem: Kullanıcı girişindeki bir hata nedeniyle programı sonlandırmak için kullanıyorum.
  • platform: Programı çalıştırdığımız işletim sistemini tanımamızı sağlar, kullanımı bizi platformdan bağımsız kılar.
  • tarih saat: Taramayı gerçekleştirmek için gereken süreyi bilmek için kullanıyorum, bilmek istemiyorsanız kaydedebilirsiniz.

Adım 2
Aşağıdaki kod parçasında, kullanıcıdan ana bilgisayar ve alt ağ aralığı gibi gerekli verileri istiyoruz. Ayrıca temelde programı kontrollü bir şekilde sonlandırmak için kullandığım bir try ve catch bloğumuz var, eğer kullanıcı tarafından girilen IP doğru değilse bloğun ilk komutu hata verecektir, eğer başlangıç ​​sorulduğunda ise bloğun ilk komutu hata verecektir. ve sonunda numara eklemez, bir hata atlar.

 ip = giriş ("IP'yi girin:") bölünmüş ip = ip.split ('.') deneyin: ağ = bölünmüş ip [0] + '.' + bölünmüş ip [1] + '.' + bölünmüş ip [2 ] + '.' start = int (input ("Alt ağın başlangıç ​​numarasını girin:")) end = int (input ("Süpürmeyi bitirmek istediğiniz sayıyı girin:")) hariç: print ("[!] Hata") sistem çıkışı (1)
Daha sonra faydalı olacak bir ağ öneki oluşturmak için try bloğundaki ilk ifadeyi kullanıyorum.

Örneğin aşağıdaki resimde eklediğim verilerle 192.168.0.190'dan 192.168.0.199'a kadar olan adreslerin aktif olup olmadığını görmek için tarardık.

Aşama 3
Kodun sonraki bölümünde kontrol ettiğim tek şey, işlev aracılığıyla hangi işletim sisteminin kullanıldığıdır. platform.sistem ().

 if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1"
Bu gereklidir çünkü tek bir paket göndermek istiyoruz ve Windows'ta talimat -n ile ve unix'te -c ile yapılır.

4. Adım
Daha sonra aşağıdaki kod parçasını analiz edeceğim:

 starttime = datetime.now () print ("[*] Tarama gerçekleştiriliyor", kırmızı + str (başlangıç), "bitiş", kırmızı + str (bitiş)) aralıktaki alt ağ için (başlangıç, bitiş + 1) : adres = ağ + str (alt ağ) yanıtı = os.popen (ping + "" + adres) için yanıt.readlines (): if ("ttl" satır. alt () içinde): yazdır (adres, "is active ") break endtime = datetime.now () time = endtime - starttime print (" [*] Tarama %s sürdü "%zaman)
Bu adım, gerçek işlevselliği gerçekleştirdiğimiz yerdir, bu yüzden başlamadan önce ilgili zamanı alıyorum:
 başlangıç ​​zamanı = tarihsaat.şimdi ()
Ve kullanıcının taramanın (ve aralığın) yapıldığını bilmesi için ekran başına bir satır çiziyoruz:
 print ("[*] Tarama yapılıyor", red + str (başlangıç), "to", red + str (bitiş))
Ardından, istenen IP adresleri aralığından geçecek bir for görüyoruz, ilk talimatı eksik sayıları ağ önekiyle birleştirir, yani 192.168.0 varsa. o zaman for döngüsü 190'dan 199'a giderse, adresi ilk girdiğinizde 192.168.0.190 olacak ve ilerledikçe 190 değişecek, gerisi bizde kalsın. Ardından, talimat tarafından gerçekleştirilen ping yanıtını alırız:
 os.popen (ping + "" + adres)
IP'nin aktif olup olmadığını bilmek için aldığımız yanıtın kelimeyi içerip içermediğini kontrol edeceğiz. ttl, Kullanırım satır.alt () çünkü Linux'ta küçük harfle, Windows'ta büyük harfle çıkıyor gibi görünüyor, bu yüzden sorunumuz yok.

Son bölümde, tek yaptığım zamanı yeniden kazanmak ve programım için geçen zamanı boyamak için bu yeni zamanı bir öncekiyle dinlendiriyorum.

Daha sonra programın yürütülmesinin bir görüntüsünü göstereceğim, görebildiğimiz gibi biraz yavaş (19 adres için 52 saniye) bu aynı zamanda bilgisayarın gücüne de bağlı, ancak bu sefer iş parçacığı kullanırsak geliştirilebilir, yani şimdi Programı "Python thread" kullanarak yapacağım.

Seçenek 2 - Dişli Python Tarayıcı


Şimdi benzer bir program başlatacağız, ama daha karmaşık bir şey, çünkü şimdi iş birkaç iş parçacığı arasında bölünecek ve sadece bir yük kalmayacak, sonunda zamanın büyük ölçüde azaldığını göreceğiz, bu yüzden söyleyebiliriz ki bu daha optimal bir versiyondur.

Program aşağıdaki gibidir:

 import os import sys import platform import threading, datetime'dan subprocess import datetime IPXHILOS = 4 ip = input ("IP'yi Girin:") bölünmüş ip = ip.split ('.') deneyin: red = bölünmüş ip [0] + ' .' + Bölünmüş ip [1] + '.' + Bölünmüş ip [2] + '.' start = int (input ("Alt ağın başlangıç ​​numarasını girin:")) end = int (input ("Süpürmeyi bitirmek istediğiniz sayıyı girin:")) hariç: print ("[!] Hata") sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" başka: ping = "ping -c 1" class Thread (threading.Thread): def __init __ ( self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = bitiş def run (self): aralıktaki alt ağ için (self.start, self.fin): adres = ağ + str (alt ağ) yanıtı = os.popen (ping + "" + adres) in response.readlines () satırı için: if ("ttl" line.lower () içinde): print (adres, "etkin") break startTime = datetime .now () print ("[*] Tarama gerçekleştiriliyor", ağ + str (başlangıç), "hedef", ağ + str (bitiş)) NumberIPs = bitiş-başlangıç ​​numarasıThreads = int ((NumberIPs) / IPXHILOS) ) threads = [] try: aralıktaki i için (numberThreads): endAux = başlangıç ​​+ IPXTHREADS if (endAux> end): endAux = thread sonu = Thread (başlangıç, endAux) thread.start () threads.append ( thread) başlangıç ​​\u200b\u200b = finAux, İstisna hariç n so e: print ("[!] Dizi oluşturma hatası:", e) dizilerdeki dizi için sys.exit (2): thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Tarama % s "% zaman aldı) 
[color = # a9a9a9] Programı tamamlayın [/ color]

Burada değişen ve eklenen komutlardan bahsedeceğim (bir önceki programa eşit olan kısımları yok sayacağım):

Bir önceki programda kullandığımız importlar bizim için geçerlidir, Python threadleri için kullanılacak olan aşağıdakileri eklememiz yeterlidir.

 içe aktarma iş parçacığı, alt işlem
Her iş parçacığının kontrol etmesini istediğim IP sayısı için bir değişken kullanıyorum, bu yüzden programın başına eklenir:
 IPXTHreads = 4
Veri için kullanıcı talebi ve işletim sistemi kontrolü olduğu gibi kalır. Bu gösteride Threading.Thread'den genişleyen Thread adında bir sınıf oluşturuyorum., bu sınıf parametre olarak her bir iş parçacığının çalışması gereken adreslerin başlangıcını ve bitişini alır, o zaman gerekli ve bu şekilde çağrılması gereken bir çalıştırma işlevim var, biz işi yaparken ilgilenecek. konuyu daha sonra başlat, for değişmez:
 class Thread (threading.Thread): def __init __ (self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = bitiş def run (self): aralıktaki alt ağ için ( self.start , self.fin): adres = ağ + str (alt ağ) yanıtı = os.popen (ping + "" + adres) yanıttaki satır için.readlines (): if ("ttl" in line.lower () ): print (adres, "etkin") sonu
Şimdi ders dışında sahip olduğum kısmı açıklayacağız. Konu.

Kullanıcının bana verdiği başlangıca ve sona göre toplam sahip olduğum IP sayısını öğrenmek için aşağıdaki talimatı kullanıyorum:

 NumberIP'ler = bitiş başlangıcı
Şimdi bunu öğrendikten sonra, çalışmam gereken iş parçacığı sayısını hesaplayabiliriz:
 numberThreads = int ((NumberIP'ler / IPXTHREADS))
Her iş parçacığını nerede saklayacağım bir listeye ihtiyacım olacak, böylece daha sonra ana iş parçacığının işin bitmesini bekletebilirim:
 iplikler = []
Aşağıdaki kod parçası konuları oluşturacak ve iş bölümlerine iletecek, bunun için her dizinin başı ve sonu ile “oynamak” zorundayız, bu yüzden finAux değişkenini yarattım. İplik oluşturulduktan sonra ile başlar Başlat () ve iş parçacığı listesine eklenir.
 deneyin: aralıktaki i için (numberThreads): endAux = başlangıç ​​+ IPXTHREADS if (endAux> end): endAux = bitiş thread = Thread (başlangıç, endAux) thread.start () threads.append (thread) başlangıç ​​= endAux, İstisna dışında e: print ("[!] Konu oluşturma hatası:", e) sys.exit (2)
Sonra amacı iş parçacıklarının bitmesini beklemek olan bir döngü oluşturuyorum
 thread içindeki thread için: thread.join () 
Ve son olarak, süre alınır, başlamadan önce aldığımdan çıkarılır ve önceki program gibi ekranda gösterilir.

Bu programla daha önce aynı testi yaparsak, aynı işi yapmanın 6 saniye sürdüğünü görüyoruz, ne fark var.

NotPC'nizin gücüne ve IPXHILOS değişkenine göre süre değişebilir, ben ona 4 atadım, her iş parçacığına daha fazla iş atarsanız daha uzun sürer, daha az işi varsa daha hızlı olur ama dikkatli olun orada oluşturabileceğimiz iş parçacığı sayısında bir sınırdır.

Bu programın bize aktif ana bilgisayarların %100'ünü sağladığına güvenebilir miyiz?Cevap hayır, ICMP isteklerini ve/veya yanıtlarını engelleyerek bir ana bilgisayardaki ping'i engelleyebileceğiniz için, emin olabileceğiniz şey, size etkin olduğunu söylüyorsa, öyledir. Bir işletim sisteminin normalde açık bıraktığı bağlantı noktalarıyla yapabileceğiniz TCP gibi başka tarayıcı türleri de vardır ve TCP ile ping tarayıcılarının kombinasyonu daha güvenilir olacaktır.

Size 2 kodlu bir posta bırakıyorum:

codigos_ping_python.zip 1.38K 270 İndirme

Bu Eğitimi beğendiniz ve yardım ettiniz mi?Yazara olumlu puan vermek için bu düğmeye basarak yazarı ödüllendirebilirsiniz.

Arkadaşlarınızla sayfasını paylaşan sitenin gelişimine yardımcı olacak

wave wave wave wave wave