¿Cómo verificar si un puerto de red está abierto en linux?

¿Cómo puedo saber si un puerto determinado está abierto / cerrado en Linux ubuntu, no en un sistema remoto, usando Python? ¿Cómo puedo listar estos puertos abiertos en python?

  • Netstat: ¿Hay una manera de integrar la salida de netstat con python?

Puede usar el módulo de socket para verificar simplemente si un puerto está abierto o no.

Se vería algo como esto.

import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print "Port is open" else: print "Port is not open" sock.close() 

Si desea utilizar esto en un contexto más general, debe asegurarse de que el socket que abre también se cierre. Así que el cheque debería ser más como esto:

 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 "Port is open" else: print "Port is not open" 

Para mí, los ejemplos anteriores se colgarían si el puerto no estuviera abierto. La línea 4 muestra el uso de settimeout para evitar colgar

 import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) #2 Second Timeout result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print 'port OPEN' else: print 'port CLOSED, connect_ex returned: '+str(result) 

Si solo le importa la máquina local, puede confiar en el paquete psutil. Tu también puedes:

  1. Compruebe todos los puertos utilizados por un pid específico:

     proc = psutil.Process(pid) print proc.connections() 
  2. Compruebe todos los puertos utilizados en la máquina local:

     print psutil.net_connections() 

Funciona en Windows también.

http://pythonhosted.org/psutil/

La herramienta Netstat simplemente analiza algunos archivos / proc como / proc / net / tcp y lo combina con el contenido de otros archivos. Sí, es altamente específico de la plataforma, pero para una solución solo para Linux, puede seguir con ella. La documentación del kernel de Linux describe estos archivos en detalle para que pueda encontrar allí cómo leerlos.

Tenga en cuenta que su pregunta es demasiado ambigua porque “puerto” también puede significar puerto serie (/ dev / ttyS * y análogos), puerto paralelo, etc .; He reutilizado la comprensión de otra respuesta: este es el puerto de red, pero le pido que formule sus preguntas con mayor precisión.

En el caso de que cuando pruebe los puertos TCP con la intención de escucharlos, es mejor llamar a escuchar. El enfoque con tring para conectar no “ve” los puertos de los clientes de las conexiones establecidas, porque nadie escucha en su. Pero estos puertos no pueden utilizarse para escuchar en su.

 import socket def check_port(port, rais=True): """ True -- it's possible to listen on this port for TCP/IPv4 or TCP/IPv6 connections. False -- otherwise. """ 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( "The server is already running on port {0}".format(port)) return True 

Acaba de agregar a la solución de mrjandro un truco rápido para deshacerse de los errores de conexión simples / tiempos de espera.

Puede ajustar el umbral cambiando el valor de la variable max_error_count y agregar notificaciones de cualquier tipo.

 import socket max_error_count = 10 def increase_error_count(): # Quick hack to handle false Port not open errors with open('ErrorCount.log') as f: for line in f: error_count = line error_count = int(error_count) print "Error counter: " + str(error_count) file = open('ErrorCount.log', 'w') file.write(str(error_count + 1)) file.close() if error_count == max_error_count: # Send email, pushover, slack or do any other fancy stuff print "Sending out notification" # Reset error counter so it won't flood you with notifications file = open('ErrorCount.log', 'w') file.write('0') file.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print "Port is open" else: print "Port is not open" increase_error_count() 

Y aquí encontrará una versión compatible con Python 3 (solo con la syntax de impresión fija):

 import socket max_error_count = 10 def increase_error_count(): # Quick hack to handle false Port not open errors with open('ErrorCount.log') as f: for line in f: error_count = line error_count = int(error_count) print ("Error counter: " + str(error_count)) file = open('ErrorCount.log', 'w') file.write(str(error_count + 1)) file.close() if error_count == max_error_count: # Send email, pushover, slack or do any other fancy stuff print ("Sending out notification") # Reset error counter so it won't flood you with notifications file = open('ErrorCount.log', 'w') file.write('0') file.close() sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) result = sock.connect_ex(('127.0.0.1',80)) if result == 0: print ("Port is open") else: print ("Port is not open") increase_error_count() 

Por favor verifica la respuesta de Michael y vota por ella. Es la forma correcta de verificar los puertos abiertos. Netstat y otras herramientas no son de ninguna utilidad si está desarrollando servicios o demonios. Por ejemplo, estoy creando el servidor Modbus TCP y los servicios de cliente para una red industrial. Los servicios pueden escuchar cualquier puerto, pero la pregunta es si ese puerto está abierto. El progtwig se utilizará en diferentes lugares, y no puedo revisarlos todos manualmente, así que esto es lo que hice:

 from contextlib import closing import socket class example: 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