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?

181voto

mrjandro Points 1882

Vous pouvez utiliser le module socket pour simplement vérifier si un port est ouvert ou non.

Cela ressemblerait à quelque chose comme ceci.

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
   print "Le port est ouvert"
else:
   print "Le port n'est pas ouvert"
sock.close()

138voto

Michael Points 1462

Si vous voulez l'utiliser dans un contexte plus général, vous devez vous assurer que le socket que vous ouvrez est également fermé. Le contrôle doit donc ressembler davantage à ceci :

import socket
from contextlib import closing

def check_socket(host, port):
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
        if sock.connect_ex((host, port)) == 0:
            print("Le port est ouvert")
        else:
            print("Le port n'est pas ouvert")

51voto

Brent Kinser Points 511

Pour moi, les exemples ci-dessus seraient en attente si le port n'était pas ouvert. La ligne 4 montre l'utilisation de settimeout pour éviter l'attente

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)                                      #Délai de 2 secondes
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
  print 'port OUVERT'
else:
  print 'port FERMÉ, connect_ex a retourné: '+str(result)

25voto

Joe Points 2100

Si vous vous souciez uniquement de la machine locale, vous pouvez compter sur le package psutil. Vous pouvez soit:

  1. Vérifiez tous les ports utilisés par un pid spécifique:

    proc = psutil.Process(pid)
    print proc.connections()
  2. Vérifiez tous les ports utilisés sur la machine locale:

    print psutil.net_connections()

Cela fonctionne également sur Windows.

https://github.com/giampaolo/psutil

7voto

Pedro Lobito Points 6794

Voici un scanneur de ports multi-threading rapide:

from time import sleep
import socket, ipaddress, threading

max_threads = 50
final = {}
def check_port(ip, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
        #sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
        socket.setdefaulttimeout(2.0) # seconds (float)
        result = sock.connect_ex((ip,port))
        if result == 0:
            # print ("Port is open")
            final[ip] = "OUVERT"
        else:
            # print ("Port is closed/filtered")
            final[ip] = "FERMÉ"
        sock.close()
    except:
        pass
port = 80
for ip in ipaddress.IPv4Network('192.168.1.0/24'): 
    threading.Thread(target=check_port, args=[str(ip), port]).start()
    #sleep(0.1)

    # limiter le nombre de threads.
    while threading.active_count() > max_threads :
        sleep(1)

print(final)

Démo en direct

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