In diesem Artikel wird gezeigt, wie mit Python verschiedene Ports überprüft werden können. Das hier gezeigt Beispiel ist im Grunde eine Fortsetzung aus dem Blogbeitrag „Verfügbarkeit eines FTP-Dienstes mit Python prüfen„. Dort wurde mithilfe des Moduls socket
die Verfügbarkeit von FTP getestet. Hier nochmal der Code:
import socket
socket.setdefaulttimeout(4)
s = socket.socket()
try:
s.connect(('192.168.170.2', 21))
except IOError:
print('An error occurred!')
Wie dem Code entnommen werden kann, wurden dazu an die Methode connect()
die IP-Adresse und der Port übergeben.
Dies lässt sich dahingehend erweitern, dass die Angabe des Ports nicht fest hinterlegt wird, sondern der Nutzer die Möglichkeit erhält, den Port (und die Zieladresse) einzugeben.
Neben dem Modul socket
wird für dieses Beispiel zusätzlich sys
importiert:
import socket
import sys
Dann folgt die Funktion check_port()
, an die die IP-Adresse und der zu prüfende Port übergeben wird. Für den Fall, dass ein Fehler auftritt, wird das Programm mit
sys.exit('Exit program!')
beendet. Andernfalls wird das Ergebnis, das der Variable banner
zugewiesen wird, an die aufrufende Funktion main()
zurückgegeben.
def check_port(ip: str, port: int) -> bytes:
s = socket.socket()
try:
s.connect((ip, port))
except Exception as e:
print(e)
sys.exit('Exit program!')
banner = s.recv(1024)
return banner
Wie man der Signatur der Funktion entnehmen kann, kommen die seit Python 3.5. zur Verfügung stehenden type annotations zum Einsatz. Die richtige Verwendung der Datentypen kann übrigens mit Tools wie pytype
(von Google) oder mypy
(von Dropbox) geprüft werden.
Die Funktion main()
ist für die Eingaben des Nutzers und die Ausgabe der mit banner = s.recv(1024)
empfangenen Bytes verantwortlich:
def main():
address = input('Enter the ip address: ')
port = int(input('Enter the port: '))
result = check_port(address, port)
print(result)
if __name__ == '__main__':
main()
Da der Benutzer nunmehr die Adresse und den Port eingeben kann, weist diese Version eine viel größere Flexibilität auf. Sie ist damit viel praxistauglicher, kann sie doch für die Prüfung einer Vielzahl von Diensten angewendet werden.
Weiterführende Links
- Using Python’s Type Annotation (Artikel bei dev.to)
- Static Typing in Python (Youtube-Video)
- Dokumentation zum Modul socket (python.org)
- Weitere Artikel zu Python