Unterschiedliche Ports mit Python überprüfen

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