español - Python: ¿Cómo verificar si un puerto de red está abierto en Linux?
socket python 3 (7)
Acaba de agregarse a la solución de mrjandro un truco rápido para deshacerse de los errores de conexión / tiempos de espera simples.
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 la sintaxis 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()
¿Cómo puedo saber si un determinado puerto está abierto / cerrado en Linux Ubuntu, no en un sistema remoto, usando Python? ¿Cómo puedo listar estos puertos abiertos en Python?
- Netstat: ¿Hay alguna manera de integrar la salida netstat con python?
En caso de que pruebe los puertos TCP con la intención de escuchar, es mejor llamar a escuchar. El enfoque con tring para conectar no ''ve'' puertos de clientes de conexiones establecidas, porque nadie escucha en su. Pero estos puertos no se pueden usar 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
La herramienta Netstat simplemente analiza algunos archivos / proc como / proc / net / tcp y los combina con el contenido de otros archivos. Sí, es muy específico de la plataforma, pero para la solución solo de Linux, puede seguir con eso. La documentación del kernel de Linux describe estos archivos en detalle para que pueda encontrar allí cómo leerlos.
Tenga en cuenta también que su pregunta es demasiado ambigua porque "puerto" también podría significar puerto en 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 pediría que formule sus preguntas con mayor precisión.
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)
Puede usar el módulo de socket para simplemente verificar 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"
Si desea usar esto en un contexto más general, debe asegurarse de que el socket que abre también se cierre. Entonces 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"
Si solo le importa la máquina local, puede confiar en el paquete psutil. Tu también puedes:
Verifique todos los puertos utilizados por un pid específico:
proc = psutil.Process(pid) print proc.connections()
Verifique todos los puertos utilizados en la máquina local:
print psutil.net_connections()
Funciona en Windows también.