Python – Leren programmeren – deel 6
Welkom bij een nieuwe Python post. In dit deel is het laatste in deze 6-delige serie. In deze post gaan we een leuk script bekijken. We gaan kijken of we met de kennis van de laatste 5 posts kunnen uitpluizen wat hier gebeurt. Let op, want dit kun je zelf nu al programmeren:
Het script / de applicatie die we gaan bekijken is een poortscanner. Always handy right!
Het gehele script ziet er als volgt uit:
import os import socket import subprocess import sys from datetime import datetime os.system('cls' if os.name == 'nt' else 'clear') remoteServer = input("Welke host wil je scannen: ") remoteServerIP = socket.gethostbyname(remoteServer) print ("-" * 60) print ("Een moment geduld, bezig met het scannen van host:", remoteServerIP) print ("-" * 60) t1 = datetime.now() try: for port in range(1,1025): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex((remoteServerIP, port)) if result == 0: print ("Port {}: Open".format(port)) sock.close() except KeyboardInterrupt: print ("U onderbrak het proces middels Ctrl+C") sys.exit() except socket.gaierror: print ('De hostname kon niet worden geresolved. We onderbreken het scanproces.') sys.exit() except socket.error: print ("Kon niet verbinden met de server.") sys.exit() t2 = datetime.now() total = t2 - t1 print ('Het scannen duurde in totaal: ', total) |
Bovenstaande script is een complete poortscanner. Laten we het script 1 voor 1 ontleden om te bekijken wat er gebeurt.
We beginnen het script door het importeren van een aantal modules:
#Importeer modules:
import os
import socket
import subprocess
import sys
from datetime import datetime |
Het volgende commando roept een functie op uit de “os” module. Deze functie zorgt ervoor dat het venster schoongemaakt wordt. Als het een Windows (NT) OS is dan wordt “cls” gebruikt en anders wordt “clear” gebruikt zoals bij MAC en Linux OS systemen de methode is om het scherm op te schonen:
os.system('cls' if os.name == 'nt' else 'clear') |
Vervolgens wordt ere en variabele aangemaakt waar de waarde van de gebruiker in opgeslagen wordt. De gebruiker wordt namelijk om input gevraagd.
remoteServer = input("Welke host wil je scannen: ") |
De volgende functie zorgt ervoor dat een hostnaam omgezet wordt in een IP adres. Deze functie wordt gehaald uit de “socket” module. Het IP adres wordt opgeslagen in de “remoteServerIP” variabele:
remoteServerIP = socket.gethostbyname(remoteServer) |
Wat er vervolgens gebeurt is dat er een banner op het scherm getoond wordt met informatie over welke host er gescand wordt. Onder de banner komen de resultaten te staan. “print (“-” * 60)” zorgt ervoor dat er 60x een “-“ symbool geprint wordt wat dus een lijntje vormt:
print ("-" * 60) print ("Een moment geduld, bezig met het scannen van host:", remoteServerIP) print ("-" * 60) |
De banner ziet er als volgt uit:
————————————————————
Een moment geduld, bezig met het scannen van host: %host%
————————————————————
Uit de “datetime” module vragen we nu de “datetime” module op waarmee we de huidige tijd ophalen en opslaan in de “t1” variabele:
t1 = datetime.now() |
Op dit moment start de scan. En deze scan starten we in een “try” loop zodat er ook nog war error afhandeling gedaan wordt. De try loop begint met de volgende statement waarin de variabele “port” een range toegewezen krijgt van poorten. In dit geval poort 1 tot (niet tot en met) 1025. Uiteraard kan de gebruiker deze range zelf veranderen:
try: for port in range(1,1025): |
Daarna wordt een socket connectie gestart (ook een socket functie) waarbij verbonden wordt met de opgegeven host en iedere poort in de “port” variabele:
result = sock.connect_ex((remoteServerIP, port)) |
Wat volgt is een “if” statement waarbij naar het resultaat van de connectie gekeken wordt. Als het resultaat 0 is dan is er verbinding en wordt de regel geprint “Poort XXX: Open”:
try: if result == 0: print ("Port {}: Open".format(port)) |
De socket wordt daarna gesloten. Als de port dus niet open is wordt de socket gesloten zonder bericht.
sock.close() |
Als er zich een uitzondering voordoet in de “try” loop is er een stukje error afhandeling die aangeeft waarom het proces onderbroken is. Hiervoor zijn de volgende “except” codeblokken opgegeven:
try: except KeyboardInterrupt: print ("U onderbrak het proces middels Ctrl+C") sys.exit() except socket.gaierror: print ('De hostname kon niet worden geresolved. We onderbreken het scanproces.') sys.exit() except socket.error: print ("Kon niet verbinden met de server.") sys.exit() |
Vervolgens, als de scan klaar is vragen we weer de huidige tijd op en deze stoppen we in variabele “t2”:
try: t2 = datetime.now() |
Tenslotte wordt de totaal scantijd berekend door de starttijd (t1) van de eindtijd (t2) af te halen:
try: total = t2 - t1 |
En als laatste handeling, als de scan voltooid is wordt de totale scantijd weergegeven:
print ('Het scannen duurde in totaal: ', total) |
Als we dan de totale code incl, comments bekijken dan ziet deze er als volgt uit:
import os import socket import subprocess import sys from datetime import datetime # Maak het scherm leeg - cls als Windows en anders clear os.system('cls' if os.name == 'nt' else 'clear') # Vraag voor input remoteServer = input("Welke host wil je scannen: ") #Als het een DNS naam is zet deze dan om in een IP remoteServerIP = socket.gethostbyname(remoteServer) # Print banner met informatie over de host die we scannen print ("-" * 60) print ("Een moment geduld, bezig met het scannen van host:", remoteServerIP) print ("-" * 60) # De tijd dat de scan gestart is t1 = datetime.now() # We gebruiken de range functie om poorten te specificeren (in dit voorbeeld scannen we de poorten 1 t/m 1024) # Verander de poorten naar eigen wens # We gebruiken ook wat error handling om fouten op te sporen en te genereren try: for port in range(1,1025): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex((remoteServerIP, port)) if result == 0: print ("Port {}: Open".format(port)) sock.close() except KeyboardInterrupt: print ("U onderbrak het proces middels Ctrl+C") sys.exit() except socket.gaierror: print ('De hostname kon niet worden geresolved. We onderbreken het scanproces.') sys.exit() except socket.error: print ("Kon niet verbinden met de server.") sys.exit() # We controleren nogmaals de tijd t2 = datetime.now() # Nu berekenen we de tijd die de scan gelopen heeft door de eerste tijd van de laatste tijd af te halen total = t2 - t1 # Print alle informatie op het scherm print ('Het scannen duurde in totaal: ', total) |
Bam, na slechts 6 Python post weet jij de basiskennis… en een beetje meer van Python. Je kunt nu scripts lezen en maken en je bent klaar om zelf je eigen scripts in bedrijf te gaan brengen. Wat ga jij doen met je nieuwe Python kennis?
Heb je handige scripts? Stuur ze naar me en ik zal ze posten op de website!
En onthoudt altijd tijdens het coden de Zen van Python (opgeschreven door Tim Peters):
———————————————————————–
De Zen van Python:
Mooi is beter dan lelijk.
Expliciet is beter dan impliciet.
Simpel is beter dan complex.
Complex is beter dan ingewikkeld.
Plat is beter dan “nested” ofwel meerdere lagen diep.
Weinig is beter dan veel.
Leesbaarheid is koning.
Uitzonderingen zijn nooit uitzonderlijk genoeg om de regels te breken,
maar uitvoerbaarheid staat wel boven zuiverheid.
Fouten mogen nooit ongezien in de code sluipen,
tenzij deze met opzet verborgen zijn.
En als zaken dubbelzinnig lijken ga dan nooit over op gokken.
–Happy Coding–
———————————————————————–
Vond je deze reeks Python posts leuk en heb je er iets van geleerd? Vergeet dan vooral niet om deze posts te delen en liken op de bekende kanalen! Dat motiveert me dubbel om weer een programmeer reeks te maken met b.v. Python Advanced of C coding?
Dank jullie wel voor het volgen!! Heel veel plezier met het maken van je eigen script!!