Netstat in Python - schnell und schmutzig

Die Idee ist schnell beschrieben: Prüfe, welche Server sich über einen bestimmten Port verbunden haben.

Normalerweise würde man einfach netstat nutzen, um zu erfahren, welche Verbindungen es zum (in diesem Falle) Oracle Listener gibt.

netstat -ant | grep 1521

Das reicht im Normalfall auch.

Nun soll über eine längere Zeit aufgezeichnet bzw. angezeigt werden, welche Server sich verbunden haben. ...und da kommt dieses kleine, schmutzige Python-Skript in's Spiel:

#!/usr/bin/env python

import subprocess
import time

CMD = "netstat -ant"
PORT = 1521
SLEEP = 10
FILE = "netstat.txt"

servers = []
try :
        while True:
                print("\33crunning \"{}\" at port {}...".format(CMD, PORT))

                proc = subprocess.Popen(CMD, shell = True, stdout = subprocess.PIPE)

                while True:
                        line = proc.stdout.readline()

                        if line == "": break
                        if line.find("*") > 0: continue
                        if line.find(":{}".format(PORT)) < 0: continue
                        line = line.strip()
                        #Proto Recv-Q Send-Q Local Address           Foreign Address         State
                        proto, recv, send, local, foreign, state = line.split()
                        if foreign.find(":{}".format(PORT)) > 0: continue

                        server = foreign[0:foreign.find(":")]
                        if not server in servers:
                                servers.append(server)

                servers.sort()
                for server in servers:
                        print(server)

                time.sleep(SLEEP)
except KeyboardInterrupt:
        with open(FILE, "w") as f:
                for server in servers:
                        f.write("{}\n".format(server))

        print "\nQuit"

Das Skript sieht ungleich (oder auch unnötig) komplexer aus, hat aber den Vorteil, dass es das Ergebnis übersichtlicher gestaltet und dieses zudem noch abspeichert.

In der Liste "servers" werden alle Server gespeichert, die sich im Laufe der Aufzeichnungen mit dem System über Port 1521 verbunden hatten. Alle 10 Sekunden wird die Liste aktualisiert und gegebenenfalls die Server-Liste erweitert. Wird das Programm mittels "Strg-C" beendet, wird daraufhin das Ergebnis in die Date "netstat.txt" geschrieben; das Programm wird kontrolliert beendet.

Das Ergebnis ist nun also eine sortierte Liste von Servern, die sich im Laufe der Messung verbunden hatten.