es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo eliminar la duplicidad de los paquetes DHCP entrantes?

Qué hacer para que no se muestre una entrada duplicada hasta que haya una actualización en la dirección MAC o IP.
Quiero imprimir solo cuando tenga los campos mencionados.

import pyshark

capture = pyshark.LiveCapture(interface='wlo2', bpf_filter='udp port 68')
capture.sniff_continuously(packet_count=16)

fields = {}

for packet in capture:
fields['mac'] = packet.dhcp.hw_mac_addr
try:
fields['vendor'] = packet.dhcp.option_vendor_class_id
fields['h_name'] = packet.dhcp.option_hostname
fields['ip'] = packet.dhcp.option_requested_ip_address
fields['sub_mask'] = packet.dhcp.option_subnet_mask
fields['server_ip'] = packet.dhcp.option_dhcp_server_id
fields['domain_name'] = packet.option.dhcp.option_domain_name
fields['dns'] = packet.dhcp.option_domain_name_server
except AttributeError:
pass
try:
print(packet.sniff_time, fields['mac'], fields['ip'], fields['h_name'], fields['vendor'])
except KeyError:
print('clave no encontrada')

clave no encontrada
2021-12-02 11:08:19.485258 34:1c:f0:6a:c9:00 192.168.1.5 M2006C3MII-Redmi9 android-dhcp-10
2021-12-02 11:25:19.461249 e0:13:b5:8f:xx:xx 192.168.1.5 vivo-1807 dhcpcd-8.1.0
2021-12-02 11:25:19.769917 e0:13:b5:8f:xx:xx 192.168.1.6 vivo-1807 dhcpcd-8.1.0
2021-12-02 11:26:44.359756 e0:13:b5:8f:xx:xx 192.168.1.6 vivo-1807 dhcpcd-8.1.0

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarnos de que no se impriman entradas duplicadas hasta que haya una actualización en la dirección MAC o IP, necesitamos mantener un diccionario de direcciones MAC e IP previamente vistas. Podemos modificar el código de la siguiente manera:

    import pyshark
    
    capture = pyshark.LiveCapture(interface='wlo2', bpf_filter='udp port 68')
    capture.sniff_continuously(packet_count=16)
    
    fields = {}
    prev_seen = {}   # Diccionario para almacenar direcciones MAC e IP previamente vistas
    
    for packet in capture:
        mac = packet.dhcp.hw_mac_addr
        ip = packet.dhcp.option_requested_ip_address
        if mac == prev_seen.get(ip):
            continue   # omitir si la IP se vio previamente con la misma MAC
        else:
            prev_seen[ip] = mac   # actualizar el diccionario con la nueva MAC para la IP
    
        try:
            fields['vendor'] = packet.dhcp.option_vendor_class_id
            fields['h_name'] = packet.dhcp.option_hostname
            fields['sub_mask'] = packet.dhcp.option_subnet_mask
            fields['server_ip'] = packet.dhcp.option_dhcp_server_id
            fields['domain_name'] = packet.option.dhcp.option_domain_name
            fields['dns'] = packet.dhcp.option_domain_name_server
        except AttributeError:
            pass
    
        if mac == prev_seen.get(ip):
            continue   # omitir si la IP se vio previamente con la misma MAC
        else:
            prev_seen[ip] = mac   # actualizar el diccionario con la nueva MAC para la IP
            fields['mac'] = mac   # agregar la MAC al diccionario si la IP es nueva
    
        if all(key in fields for key in ['mac', 'vendor', 'h_name', 'ip']):
            print(packet.sniff_time, fields['mac'], fields['ip'], fields['h_name'], fields['vendor'])
    

    Aquí, mantenemos un diccionario prev_seen para hacer un seguimiento de las direcciones MAC previamente vistas para cada IP. Si la IP se vio previamente con la misma MAC, omitimos el paquete. Si la IP es nueva o tiene una MAC diferente, actualizamos el diccionario prev_seen y agregamos la dirección MAC al diccionario fields. También verificamos si todos los campos requeridos están presentes en el diccionario fields antes de imprimir la información del paquete.

Comments are closed.