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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.