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?

3voto

Netch Points 3027

L'outil Netstat analyse simplement certains fichiers du répertoire /proc comme /proc/net/tcp et les combine avec d'autres contenus de fichiers. Oui, c'est très spécifique à la plate-forme, mais pour une solution uniquement sous Linux, vous pouvez vous en tenir à cela. La documentation du noyau Linux décrit ces fichiers en détail afin que vous puissiez trouver comment les lire.

Veuillez également noter que votre question est trop ambiguë car "port" pourrait aussi signifier port série (/dev/ttyS* et analogues), port parallèle, etc.; J'ai réutilisé la compréhension d'une autre réponse selon laquelle il s'agit d'un port réseau mais je vous demande de formuler vos questions de manière plus précise.

2voto

Hadi Points 29

Veuillez vérifier la réponse de Michael et voter pour elle. C'est la bonne façon de vérifier les ports ouverts. Netstat et d'autres outils ne servent à rien si vous développez des services ou des démons. Par exemple, je crée des services serveur et client Modbus TCP pour un réseau industriel. Les services peuvent écouter n'importe quel port, mais la question est de savoir si ce port est ouvert? Le programme va être utilisé dans différents endroits, et je ne peux pas tous les vérifier manuellement, c'est pourquoi j'ai fait ceci:

from contextlib import closing
import socket
class exemple:
    def __init__():

       self.machine_ip = socket.gethostbyname(socket.gethostname())
       self.ready:bool = self.check_socket()

    def check_socket(self)->bool:
        result:bool = True
        with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
        modbus_tcp_port:int = 502
        if not sock.connect_ex((self.machine_ip, modbus_tcp_port)) == 0:
            result = False
        return result

0voto

user1495323 Points 93

Cela trouvera un port aléatoire dans la plage donnée:

import socket
import random 
from typing import Tuple

def find_listening_port(
    port_range:Tuple[int,int]=None, 
    host='', 
    socket_type='tcp', 
    default:int=None
) -> int:
    """Trouver un port d'écoute disponible

    Arguments:
        port_range: Tuple optionnel des ports à rechercher aléatoirement, ``[min_port, max_port]``
            Si omis, rechercher aléatoirement entre ``[6000, 65534]``
        host: Interface hôte à rechercher, si omise alors se lier à toutes les interfaces
        socket_type: Le type de socket, cela devrait être ``tcp`` ou ``udp``
        default: Le port à essayer en premier avant de rechercher aléatoirement dans la plage des ports

    Renvoie:
        Port disponible pour l'écoute
    """
    def _test_port(host, port, socket_protocol):
        with socket.socket(socket.AF_INET, socket_protocol) as sock:
            try:
                sock.bind((host, port))
                if socket_type == 'tcp':
                    sock.listen(1)
                return port
            except:
                pass 

        return -1

    if port_range is None:
        port_range = (6000,65534)

    if socket_type == 'tcp':
        socket_protocol = socket.SOCK_STREAM
    elif socket_type == 'udp':
        socket_protocol = socket.SOCK_DGRAM
    else:
        raise Exception('Argument socket_type invalide, doit être: tcp ou udp')

    searched_ports = []
    if default is not None:
        port = _test_port(host, default, socket_protocol)
        if port != -1:
            return port
        searched_ports.append(default)

    for _ in range(100):
        port = random.randint(port_range[0], port_range[1])
        if port in searched_ports:
            continue 

        port = _test_port(host, port, socket_protocol)
        if port != -1:
            return port

        searched_ports.append(port)

    raise Exception(f'Impossible de trouver un port d\'écoute {socket_type} pour l\'hôte={host}')

Exemple d'utilisation:

# Trouver un port TCP,
# vérifier d'abord si le port 80 est disponible
port = find_listening_port(
    port_range=(4000, 60000),
    host='',
    socket_type='tcp',
    default=80
)
print(f'Port TCP disponible: {port}')

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