118 votes

Comment vérifier si un port réseau est ouvert?

Comment puis-je savoir si un certain port est ouvert/fermé sur Linux Ubuntu, pas sur un système distant, en utilisant Python? Comment puis-je répertorier ces ports ouverts en Python?

  • Netstat: Y a-t-il un moyen d'intégrer la sortie de netstat avec Python?

7voto

Sachin Verma Points 113

J'ai trouvé plusieurs solutions dans ce post. Mais certaines solutions ont un problème de ralentissement ou prennent trop de temps si le port n'est pas ouvert. Essayez la solution ci-dessous :

import socket 

def port_check(HOST):
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.settimeout(2) #Délai en cas de port non ouvert
   try:
      s.connect((HOST, 22)) #Port, ici 22 est le port 
      return True
   except:
      return False

port_check("127.0.1.1")

5voto

Alexander Turenko Points 343

En cas de sonde des ports TCP avec l'intention d'écouter dessus, il vaut mieux appeler réellement la méthode listen. L'approche consistant à tenter de se connecter ne « voit » pas les ports clients des connexions établies, car personne n'écoute dessus. Mais ces ports ne peuvent pas être utilisés pour écouter dessus.

import socket

def check_port(port, rais=True):
    """ True -- il est possible d'écouter sur ce port pour des connexions TCP/IPv4 ou TCP/IPv6. False -- sinon. """
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('127.0.0.1', port))
        sock.listen(5)
        sock.close()
        sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
        sock.bind(('::1', port))
        sock.listen(5)
        sock.close()
    except socket.error as e:
        return False
        if rais:
            raise RuntimeError(
                "Le serveur tourne déjà sur le port {0}".format(port))
    return True

5voto

Philipp Keller Points 723

S'appuyant sur la solution psutil mentionnée par Joe (ne fonctionne que pour vérifier les ports locaux) :

import psutil
1111 in [i.laddr.port for i in psutil.net_connections()]

retourne True si le port 1111 est actuellement utilisé.

psutil ne fait pas partie de la bibliothèque standard de Python, vous devriez donc d'abord effectuer un pip install psutil. Il a également besoin des en-têtes Python pour être disponibles, donc vous avez besoin de quelque chose comme python-devel

4voto

Pitto Points 160

Juste ajouté à la solution de mrjandro quelques améliorations comme la gestion automatique des ressources (en veillant à ce que le socket ouvert soit également fermé), la gestion des délais d'attente, en se débarrassant des erreurs / délais d'attente de connexion simples et l'impression des résultats :

import socket
from contextlib import closing

hosts = ["hôte1", "hôte2", "hôte3"]
port = 22
timeout_en_secondes = 2

hôtes_avec_port_ouvert = []
hôtes_avec_port_fermé = []
hôtes_avec_erreurs = []

def verifier_port(hôte, port, timeout_en_secondes):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.settimeout(timeout_en_secondes)
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
        try:
            résultat = sock.connect_ex((hôte, port))
            if résultat == 0:
                print("Le port {} est *** OUVERT *** sur l'hôte: {}".format(port, hôte))
                hôtes_avec_port_ouvert.append(hôte)
            else:
                print("Le port {} n'est pas ouvert sur l'hôte: {}".format(port, hôte))
                hôtes_avec_port_fermé.append(hôte)
        except socket.gaierror:
            print("La vérification du port {} retourne une *** ERREUR *** réseau sur l'hôte: {}".format(port, hôte))
            hôtes_avec_erreurs.append(hôte)

for hôte in hôtes:
    verifier_port(hôte, port, timeout_en_secondes)

print("\nHôtes avec un port ouvert:")
print(hôtes_avec_port_ouvert)
print("\nHôtes avec un port fermé:")
print(hôtes_avec_port_fermé)
print("\nHôtes avec des erreurs:")
print(hôtes_avec_erreurs)

4voto

D'accord avec Sachin. Juste une amélioration, utilisez connect_ex à la place de connect, ce qui peut éviter les blocs try except

>>> def port_check(ip_port):
...     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
...     s.settimeout(1)
...     return s.connect_ex(ip_port) == 0
... 
>>> port_check(loc)
True
>>> port_check(loc_x)
False
>>> loc
('10.3.157.24', 6443)
>>>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X