Forum: PC-Programmierung Python testen ob Port offen


von Alex (Gast)


Lesenswert?

Hallo

ich möchte in Python3 testen, ob an einer bestimmten IP Adresse ein 
bestimmter Port offen ist. Im Internet wird oft folgende Funktion dazu 
verwendet:
1
import socket
2
def isOpen(ip,port):
3
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
4
   try:
5
      s.connect((ip, int(port)))
6
      s.shutdown(2)
7
      return True
8
   except:
9
      return False


Bei mir ist die Funktion allerdings immer wahr. Kann dies jemand 
bestätigen?

von Lutz B. (lutzbroszio)


Lesenswert?

Kannst parallel Mal mit telnet probieren, ob der Port erreichbar ist.

Woher weißt Du, dass der Port wirklizch offen ist?

Wie sehen ip und port aus? Gib bitte Mal ein ausführbares Testprogramm.

Von der Logik her sollte die Funktion funktionieren.

von Norbert (Gast)


Lesenswert?

1
#!/usr/bin/python3
2
# -*- coding: utf-8 -*-
3
#
4
import os
5
import sys
6
7
import socket
8
9
def isOpen(ip,port):
10
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11
   try:
12
      s.connect((ip, int(port)))
13
      s.shutdown(2)
14
      return True
15
   except:
16
      return False
17
18
def main(args):
19
    print(isOpen('localhost',22222))
20
    print(isOpen('localhost',80))
21
    return 0
22
23
if __name__ == '__main__':
24
    sys.exit(main(sys.argv))
False
True

von Imonbln (Gast)


Lesenswert?

Alex schrieb:
> ich möchte in Python3 testen, ob an einer bestimmten IP Adresse ein
> bestimmter Port offen ist.

Der Code wird funktionieren, aber generell sollte man eher den EAFP 
(https://docs.python.org/3/glossary.html#term-eafp) Ansatz wählen, siehe 
zum Beispiel 
https://en.wikipedia.org/wiki/Python_syntax_and_semantics#Exceptions 
oder https://en.wikipedia.org/wiki/Time-of-check_to_time-of-use als 
Erklärung warum es eine schlechte Idee ist auf einen offenen Port zu 
prüfen.

Exceptions in Python sind billig und schnell und ob ein Port offen ist, 
das ist eine Momentaufnahme und kann im nächsten Wimpernschlag anders 
sein. Folglich brauchst du sowieso Code, der damit umgehen kann, dass 
der Port trotz des Checks nicht offen ist (wenn auch die 
Wahrscheinlichkeit sehr viel geringer ist).
In Folge der Erkenntnis, das dein eigentlicher zugriff mit der Situation 
Port ist nicht offen, trotz des anders lautenden Check umgehen können 
muss folgt, der Check hat keine verlässliche aussage und kostet nur 
Zeit, daher solltest du EAFP nutzen und auf den Check verzichten.

von Alex (Gast)


Lesenswert?

nehme ich eine willkürliche IP und prüfe auf http port, erhalte ich 
immer die Antwort, der Port sei offen.

im terminal wird bei: ping 123.123.123.123
ein timeout angezeigt

bei
1
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2
try:
3
  s.connect(("123.123.123.123", int(22)))
4
  s.shutdown(2)
5
  print ("port open")
6
except:
7
  print ("port NOT open")

erhalte ich jedesmal "port open"

von Walter K. (walter_k488)


Lesenswert?

Alex schrieb:
> nehme ich eine willkürliche IP und prüfe auf http port, erhalte ich
> immer die Antwort, der Port sei offen.
> im terminal wird bei: ping 123.123.123.123
> ein timeout angezeigt

Was ja logisch sein dürfte, da Du dieses Netz mit Sicherheit gar nicht 
erreichen kannst

von Ein Vorschlag (Gast)


Lesenswert?

> erhalte ich jedesmal "port open"

Hmmm... ich bekomme eine Exception TimeoutError und lande im except 
Zweig.

Python 3.6.5 unter Linux. Socket.py macht direkte Betriebssystemaufrufe. 
Vielleicht ist das auf deinen Betriebssystem anders?

von Alex (Gast)


Lesenswert?

grummel...
Problem gefunden

hatte Kaspersky VPN aktiviert, damit erhalte ich bei jeder Anfrage im 
Python Code eine positive rückmeldung.
VPN deaktivert, nun läuft der Code wie er soll

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.