Python 3.4: código de formato desconocido ‘x’

Tengo problemas con el sniffer de paquetes en Python3.

versión de python: 3.4

Seguí un tutorial que funciona, pero no en mi computadora. Este código tiene que obtener la dirección mac, convertirla en una cadena y el método main () debería imprimirme en mi destino mac, source mac y protocol.

código: sniffer_demo.py

import socket import struct import textwrap def main(): conn = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.ntohs(3)) while True: raw_data, addr = conn.recvfrom(65536) # one's and zero's put to the method ehternet_frame dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data) print('\nEthernet Frame:') print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto)) # Unpack ethernet frame def ethernet_frame(data): dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14]) return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:] # Return properly formatted MAC address: (ie AA:BB:CC:DD:EE:FF) def get_mac_addr(bytes_addr): bytes_str = map('{:02x}'.format, bytes_addr) return ':'.join(bytes_str).upper() main() 

El error es:

     Traceback (most recent call last): File "sniffer_demo.py", line 28, in  main() File "sniffer_demo.py", line 11, in main dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data) File "sniffer_demo.py", line 19, in ethernet_frame return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:] File "sniffer_demo.py", line 24, in get_mac_addr bytes_str = map('{:02x}'.format, bytes_addr) ValueError: Unknown format code 'x' for object of type 'str' 

    ¿Cómo arreglar eso?

    Mientras intenta reproducir, su código parece funcionar exactamente como se esperaba. No veo ninguna línea de shebang. ¿Estás seguro de que estás ejecutando usando python3 ?

    Salida de muestra de # python3.4 snif2.py :

     Ethernet Frame: Destination: A4:17:31:xx:xx:xx, Source: 00:0C:F6:xx:xx:xx, Protocol: 8 Ethernet Frame: Destination: 00:0C:F6:xx:xx:xx, Source: A4:17:31:xx:xx:xx, Protocol: 8 ^CTraceback (most recent call last): File "snif2.py", line 27, in  main() File "snif2.py", line 9, in main raw_data, addr = conn.recvfrom(65536) KeyboardInterrupt 

    Actualiza tu Python a la versión 3.6.