Escáner de puertos con subprocesos usando sockets en Python

El escaneo de puertos puede ser muy lento, pero en la mayoría de los casos, no es un proceso intensivo. Por lo tanto, podemos usar subprocesos para mejorar nuestra velocidad. Puede haber miles de puertos posibles. Si se tarda de 5 a 15 segundos por puerto en escanear, es posible que tengamos una larga espera por delante sin el uso de subprocesos.

enhebrar

La creación de subprocesos es un tema complejo, pero puede desglosarse y conceptualizarse como una metodología en la que podemos decirle a la computadora que realice otra tarea si el procesador experimenta tiempo de inactividad. En el caso de la exploración de puertos, pasamos mucho tiempo esperando la respuesta del servidor. Mientras esperamos, podemos hacer otra cosa. Para eso se usa el enhebrado. 

Ejemplo: en este programa, podemos escanear una cantidad de puertos en un cierto rango.

Python3

import threading
from queue import Queue
import time
import socket
  
# a print_lock is used to prevent "double"
# modification of shared variables this is
# used so that while one thread is using a
# variable others cannot access it Once it
# is done, the thread releases the print_lock.
# In order to use it, we want to specify a
# print_lock per thing you wish to print_lock.
print_lock = threading.Lock()
  
# ip = socket.gethostbyname(target)
target = 'localhost'
  
def portscan(port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    try:
        con = s.connect((target, port))
        with print_lock:
            print('port is open', port)
        con.close()
    except:
        print('port is close', port)
  
  
# The threader thread pulls a worker 
# from a queue and processes it
def threader():
    while True:
        # gets a worker from the queue
        worker = q.get()
  
        # Run the example job with the available 
        # worker in queue (thread)
        portscan(worker)
  
        # completed with the job
        q.task_done()
  
  
# Creating the queue and threader
q = Queue()
  
# number of threads are we going to allow for
for x in range(4):
    t = threading.Thread(target=threader)
  
    # classifying as a daemon, so they it will
    # die when the main dies
    t.daemon = True
  
    # begins, must come after daemon definition
    t.start()
  
  
start = time.time()
  
# 10 jobs assigned.
for worker in range(1, 10):
    q.put(worker)
  
# wait till the thread terminates.
q.join()

Producción: 

port is close 2
port is close port is close 4
port is closeport is close 1
 53

port is close 6port is close
 7
port is close 8
port is close 9

Publicación traducida automáticamente

Artículo escrito por ashishguru9803 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *