Python testen ob Port offen

Gast #6909629
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?
Gast #6909644
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
Gast #6909715
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.
Gast #6910228
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"
Gast #6910283
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren