Automatischer Scanner zum Auffinden aktiver Hosts mit Python

Möchten Sie sehen, welche IPs in einem Netzwerk aktiv sind? Möchten Sie wissen, wie ein Programm dieser Art durchgeführt wird? Heute zeige ich es dir Wie erstelle ich ein Programm in Python 3, das das Netzwerk scannt? in einem Bereich von IPs, die der Benutzer bereitstellt.

Für diese Aufgabe werden wir den Ping des Betriebssystems automatisieren.

Option 1 - Einfacher Scanner


Ich setze diese erste Option ein, weil sie einfacher zu verstehen und auszuführen ist, bevor ich mich auf etwas Komplizierteres einlasse.

Das komplette Programm sieht wie folgt aus:

 import os import sys import platform from datetime import datetime ip = input ("Geben Sie die IP ein:") geteilte ip = ip.split ('.') try: red = geteilte ip [0] + '.' + geteilte ip [1 ] + ' . '+ ipDivided [2] +'. ' start = int (input ("Geben Sie die Startnummer des Subnetzes ein:")) end = int (input ("Geben Sie die Nummer ein, an der Sie den Sweep beenden möchten:")) außer: print ("[!] Error" ) sys.exit (1) if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1" starttime = datetime.now () print ("[ * ] Der Scan wird von ", red + str (start)," bis ", red + str (end)) nach Subnetz in Reichweite (start, end + 1) durchgeführt: address = red + str (subnet) response = os .popen (ping + "" + Adresse) für Zeile in response.readlines (): if ("ttl" in line.lower ()): print (Adresse, "ist aktiv") break endtime = datetime.now () time = endTime - startTime print ("[*] Der Scan dauerte% s"% Zeit) 
[color = # a9a9a9] Kompletter Code[/color]

Schritt 1
Wir müssen einige Bibliotheken für unser Programm importieren:

 import os import sys importplattform von datetime import datetime
[color = # a9a9a9] Bibliotheken [/color]

Erklärung der Bibliotheken

  • Sie: Wir brauchen es, um das Betriebssystem zu pingen.
  • sys: Ich benutze es, um das Programm aufgrund eines Fehlers in der Benutzereingabe zu beenden.
  • Plattform: Es ermöglicht uns, das Betriebssystem zu kennen, auf dem wir das Programm ausführen, seine Verwendung macht uns plattformunabhängig.
  • Terminzeit: Ich benutze es, um zu wissen, wie lange der Scan dauert. Wenn Sie es nicht wissen möchten, können Sie es speichern.

Schritt 2
Im folgenden Codefragment fragen wir den Benutzer nach den notwendigen Daten, wie zum Beispiel dem Host und dem Subnetzbereich. Wir haben auch einen try-and-catch-Block, den ich grundsätzlich verwende, um das Programm kontrolliert zu beenden und Ende fügt es keine Zahlen ein, es wird ein Fehler überspringen.

 ip = Eingabe ("Geben Sie die IP ein:") geteilte ip = ip.split ('.') try: network = geteilte ip [0] + '.' + geteilte ip [1] + '.' + geteilte ip [2 ] + '. ' start = int (input ("Geben Sie die Startnummer des Subnetzes ein:")) end = int (input ("Geben Sie die Nummer ein, an der Sie den Sweep beenden möchten:")) außer: print ("[!] Error" ) sys.exit (1)
Ich verwende die erste Anweisung im try-Block, um ein Netzwerkpräfix zu erstellen, das später nützlich sein wird.

Im folgenden Bild mit den Daten, die ich einfüge, würden wir beispielsweise scannen, um zu sehen, ob die Adressen von 192.168.0.190 bis 192.168.0.199 aktiv sind.

Schritt 3
Im nächsten Teil des Codes überprüfe ich nur, welches Betriebssystem durch die Funktion verwendet wird plattform.system ().

 if (platform.system () == "Windows"): ping = "ping -n 1" else: ping = "ping -c 1"
Dies ist notwendig, da wir ein einzelnes Paket versenden wollen, und in Windows erfolgt die Anweisung mit -n und unter Unix mit -c.

Schritt 4
Als nächstes werde ich den folgenden Codeausschnitt analysieren:

 starttime = datetime.now () print ("[*] Der Scan wird durchgeführt von", red + str (start), "to", red + str (end)) für Subnetz im Bereich (start, end + 1) : address = network + str (subnet) response = os.popen (ping + "" + address) für Zeile in response.readlines (): if ("ttl" in line.lower ()): print (Adresse, "is active ") break endtime = datetime.now () time = endtime - starttime print (" [*] Der Scan dauerte% s "% time)
In diesem Schritt führen wir die eigentliche Funktionalität aus, also bekomme ich vor dem Start die entsprechende Zeit:
 starttime = datetime.now ()
Und wir zeichnen eine Zeile pro Bildschirm, damit der Benutzer weiß, dass der Scan durchgeführt wird (und den Bereich):
 print ("[*] Der Scan erfolgt von", rot + str (Start), "to", rot + str (Ende))
Dann sehen wir ein for, das den Bereich der gewünschten IP-Adressen durchläuft, seine erste Anweisung verkettet die fehlenden Zahlen mit dem Netzwerkpräfix, dh wenn wir 192.168.0 haben. Wenn die for-Schleife von 190 auf 199 geht, wird die Adresse beim ersten Eingeben 192.168.0.190 lauten und im weiteren Verlauf wird die 190 geändert, den Rest behalten wir. Dann erhalten wir die Ping-Antwort, die durch die Anweisung ausgeführt wird:
 os.popen (Ping + "" + Adresse)
Um zu wissen, ob die IP aktiv ist, prüfen wir, ob die Antwort, die wir haben, das Wort enthält ttl, Ich benutze line.lower () weil es scheint, dass es in Linux in Kleinbuchstaben und in Windows in Großbuchstaben ausgegeben wird, also haben wir keine Probleme.

Im letzten Teil bekomme ich nur noch die Zeit, und ich ruhe diese neue Zeit mit der vorherigen aus, um die Zeit zu malen, die für mein Programm benötigt wurde.

Als nächstes zeige ich ein Bild der Ausführung des Programms, da wir sehen können, dass es etwas langsam ist (52 Sekunden für 19 Adressen), es hängt auch von der Leistung des PCs ab, aber diese Zeit kann verbessert werden, wenn wir Threads verwenden, also jetzt Ich werde das Programm mit den " Python-Threads " erstellen.

Option 2 – Python-Scanner mit Thread


Jetzt starten wir ein ähnliches Programm, aber etwas komplexer, da nun die Arbeit auf mehrere Threads aufgeteilt wird und nicht nur eine Last übrig bleibt, am Ende werden wir sehen, dass die Zeit stark reduziert wird, also können wir sagen was eine optimalere Version ist.

Das Programm ist wie folgt:

 import os import sys import platform import threading, subprocess from datetime import datetime IPXHILOS = 4 ip = input ("Geben Sie die IP ein:") geteilte ip = ip.split ('.') try: red = geteilte ip [0] + ' .' + Geteilte IP [1] + '.' + Geteilte IP [2] + '.' start = int (input ("Geben Sie die Startnummer des Subnetzes ein:")) end = int (input ("Geben Sie die Nummer ein, an der Sie den Sweep beenden möchten:")) außer: 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): für Subnetz in Reichweite (self.start, self.fin): address = network + str (subnet) response = os.popen (ping + "" + address) für Zeile in response.readlines (): if ("ttl" in line.lower ()): print (Adresse, "ist aktiv") break startTime = datetime .now () print ("[*] Der Scan wird durchgeführt von", network + str (Anfang), "to", network + str (end)) NumberIPs = end-beginning numberThreads = int ((NumberIPs / IPXHILOS) ) threads = [] try: für i im Bereich (numberThreads): endAux = Anfang + IPXTHREADS if (endAux> end): endAux = Ende thread = Thread (Anfang, EndAux) thread.start () threads.append ( Thread) Anfang = finAux außer Exception n so e: print ("[!] Fehler beim Erstellen von Threads:", e) sys.exit (2) für Thread in Threads: thread.join () endtime = datetime.now () time = endtime - starttime print ("[ *] Der Scan dauerte % s "% Zeit) 
[color=#a9a9a9] Komplettes Programm[/color]

Hier werde ich Ihnen von Anweisungen erzählen, die sich ändern und hinzugefügt werden (ich werde die Teile ignorieren, die dem vorherigen Programm entsprechen):

Die Importe, die wir im vorherigen Programm verwenden, sind für uns gültig, wir müssen nur die folgenden hinzufügen, die für die Python-Threads verwendet werden.

 Threading importieren, Unterprozess
Ich verwende eine Variable für die Anzahl der IPs, die jeder Thread überprüfen soll, also wird sie am Anfang des Programms hinzugefügt:
 IPXTHREADS = 4
Die Datenanforderung des Benutzers und die Betriebssystemprüfung bleiben erhalten. In dieser Sendung Ich erstelle eine Klasse namens Thread, die von threading.Thread erweitert wird, diese Klasse erhält als Parameter den Anfang und das Ende der Adressen, mit denen jeder Thread arbeiten muss, dann habe ich eine run-Funktion, die notwendig ist und so aufgerufen werden muss, die sich um die Arbeit kümmert, wenn wir starte den thread später , das for ändert sich nicht:
 class Thread (threading.Thread): def __init __ (self, start, end): threading.Thread .__ init __ (self) self.start = start self.fin = end def run (self): für Subnetz in Reichweite ( self.start , self.fin): address = network + str (subnet) response = os.popen (ping + "" + address) für Zeile in response.readlines (): if ("ttl" in line.lower() ): print ( Adresse, "ist aktiv") Pause
Jetzt werden wir den Teil erklären, den ich außerhalb des Unterrichts habe Gewinde.

Ich verwende die folgende Anweisung, um die Anzahl der IPs zu erfahren, die ich insgesamt habe, je nach Anfang und Ende, die mir der Benutzer gibt:

 NumberIPs = Ende-Start
Sobald wir das wissen, können wir die Anzahl der Threads berechnen, die ich zum Arbeiten benötige:
 numberThreads = int ((NumberIPs / IPXTHREADS))
Ich benötige eine Liste, in der jeder Thread gespeichert werden soll, damit ich später den Hauptthread warten lassen kann, bis der Job abgeschlossen ist:
 Fäden = []
Das folgende Codefragment wird die Threads erstellen und ihnen ihren Arbeitsabschnitt übergeben, dazu müssen wir mit dem Anfang und Ende jedes Threads „spielen“, deshalb habe ich die Variable finAux erstellt. Sobald der Thread erstellt wurde, beginnt er mit starten () und wird der Thread-Liste hinzugefügt.
 try: für i im Bereich (numberThreads): endAux = begin + IPXTHREADS if (endAux> end): endAux = end thread = Thread (beginn, endAux) thread.start () threads.append (thread) begin = endAux außer Ausnahme als e: print ("[!] Fehler beim Erstellen von Threads:", e) sys.exit (2)
Als nächstes erstelle ich eine Schleife, deren Zweck es ist, zu warten, bis die Threads fertig sind
 für Gewinde in Gewinden: thread.join () 
Und schließlich wird die Zeit genommen, sie wird von der Zeit abgezogen, die ich vor dem Start genommen habe, und sie wird auf dem Bildschirm angezeigt, genau wie das vorherige Programm.

Wenn wir den gleichen Test wie zuvor mit diesem Programm durchführen, sehen wir, dass es 6 Sekunden dauert, um die gleiche Arbeit zu erledigen, was für ein Unterschied.

NotizDie Zeit kann je nach Leistung Ihres PCs und der Variablen IPXHILOS variieren, ich weise ihr eine 4 zu, wenn Sie jedem Thread mehr Arbeit zuweisen, dauert es länger, wenn er weniger Arbeit hat, wird es schneller, aber seien Sie vorsichtig, dass es ist eine Begrenzung der Anzahl von Threads, die wir erstellen können.

Können wir darauf vertrauen, dass dieses Programm uns 100 % der aktiven Gastgeber liefert?Die Antwort ist nein, da Sie den Ping auf einem Host blockieren können, indem Sie ICMP-Anfragen und / oder -Antworten blockieren, können Sie sicher sein, dass dies der Fall ist, wenn er Ihnen mitteilt, dass er aktiv ist. Es gibt andere Arten von Scannern, z. B. TCP, die Sie mit den Ports verwenden können, die ein Betriebssystem normalerweise offen lässt, und die Kombination aus TCP- und Ping-Scannern ist zuverlässiger.

Ich hinterlasse Ihnen eine Postleitzahl mit den 2 Codes:

codigos_ping_python.zip 1.38K 270 Downloads

Hat dir dieses Tutorial gefallen und geholfen?Sie können den Autor belohnen, indem Sie diesen Knopf drücken, um ihm einen positiven Punkt zu geben

Sie werden die Entwicklung der Website helfen, die Seite mit Ihren Freunden teilen

wave wave wave wave wave