Я новичок, но я пытаюсь создать утилиту сетевого сканирования, которая может фильтровать адреса MA C для конкретной потребности c; Компания, в которой я работаю, имеет подключенные к сети устройства, которым назначены адреса MA C на основе серийных номеров. Я обнаружил, что первые 6 цифр адреса MA C являются показателем нашего бренда. Это я сделал в ул ниже. 4-е поле адреса MA C - это небольшой диапазон постоянных чисел, обозначающих модель устройства. У меня есть эти готовые, но по сути это несколько цифр, таких как «14», «17», «et c.
. Я изо всех сил пытаюсь найти способ« фильтровать »адреса MA C, которые извлекаются из сканирования и маркируют их в зависимости от полей адреса. ИЛИ еще лучше, печатать только IP-адреса и адреса Ma c, которые соответствуют начальному значению (mac_key), и маркировать оставшиеся объекты в соответствии с их полем MA C address 4 [9:11].
С большим количеством о чтении и помощи, я получил это до сих пор:
#!/usr/bin/env python
from scapy.all import ARP, Ether, srp
import socket
# importing main functions from Scapy and Socket
mac_key = '04:24:2f'
# Target value for first three fields of MAC address
hostname = socket.gethostname()
IPAddr = socket.gethostbyname(hostname)
target_ip = ("192.168.{}.0/24".format(IPAddr[6]))
# Assigning index value for third section of IP address
# To make third section of target_ip a variable determined by host
# "/24" denotes IP address spectrum for the ARP packet destination
arp = ARP (pdst=target_ip)
# Creating ARP packet assigned to "target_ip"
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
# Creating Ether broadcast packet
# ff:ff:ff:ff:ff:ff MAC address indicates broadcasting
packet = ether/arp
# Stacking
result = srp(packet, timeout=5, verbose=3)[0]
# Defining result with timeout parameter
clients= []
# Client list to be finished below
for sent, received in result:
clients.append({'ip': received.psrc, 'mac': received.hwsrc})
# For each response, append ip and mac address to 'clients' list
print("Devices On This Network:")
print("IP" + " "*18+"MAC")
# Print table of accumulated data
for client in clients:
print("{:24} {}".format(client['ip'], client['mac'].startswith(mac_key)))
# Printing IP addresses and assosciated MACs from clients list
# With bool checking against mac_key
Изображение ниже - результат в терминале; Идея заключалась бы в том, чтобы печатать только строки, которые показывают значение TRUE, и добавить метку на основе поля [9:11] адреса MA C, например: «Network Device Pro», где появляется TRUE bool, и полностью пропустить линия, где запускается ложное bool.
РЕДАКТИРОВАТЬ: Ну, я превратил это в блог на данный момент. Мне удалось сделать именно то, что я хотел сделать, и я предоставлю код ниже для тех, кто пытается сделать что-то подобное. Я открыт для любых предложений, чтобы сделать это более «pythoni c» и улучшить производительность / синтаксис. У меня есть один вопрос к любому, кто может дать совет; Я хочу l oop этот код и добавить информацию в список визуализации и включить переключатель уничтожения пользовательского ввода для завершения sh. Таким образом, если пакет не достигает первого сканирования, он все равно будет добавлен в список. Бонусные баллы, если вы можете предложить предложение для этого, а также способ удалить записи, которые не отвечают после последовательного числа циклов !!
#!/usr/bin/env python3
# coding: utf-8
#
#
#//////////////////////////////////
#----------------------------------
# ippy Network Scanning Utility
# ~ Daniel Johnston 2020 ~
#----------------------------------
#\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
#
#
print("Initializing Scan...")
from scapy.all import ARP, Ether, srp
import socket
# importing main functions from Scapy and Socket
mac_key = ('00:25:2f')
# Target value for first three fields of MAC address (Brand Identifier)
MTU_key = ('13','15','16','17')
GW_key = ('21')
ECC_key = ('26')
#------serial numbers)------#
#('13','15','16','17','21','26'#
#---------LEGEND------------#
#serial numbers[0:3] = 'MTU'
#serial numbers[4] = 'Gateway'
#serial numbers[5] = 'ECC'
#---------------------------#
hostname = socket.gethostname()
IPAddr = socket.gethostbyname(hostname)
target_ip = ("192.168.{}.0/24".format(IPAddr[6]))
# Assigning index value for third section of IP address
# To make third section of target_ip a variable determined by host
# "/24" denotes IP address spectrum for the ARP packet destination
def devsub(x):
if x.startswith(MTU_key, 9, 11):
print("{} {}".format('MTU', client['ip'],))
if x.startswith(GW_key, 9, 11):
print("{} {}".format('Gateway', client['ip'],))
if x.startswith(ECC_key, 9, 11):
print("{} {}".format('ECC', client['ip'],))
# Defining function to print associated IP addresses, of MAC address
# Matches(done later), and assigning a device name based on
# index[9:11] of MAC
arp = ARP (pdst=target_ip)
# Creating ARP packet assigned to "target_ip"
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
# Creating Ether broadcast packet
# ff:ff:ff:ff:ff:ff MAC address indicates broadcasting
packet = ether/arp
# Stacking
result = srp(packet, timeout=5, verbose=3)[0]
# Defining result with timeout parameter
clients= []
# Client list to be finished below
for sent, received in result:
clients.append({'ip': received.psrc, 'mac': received.hwsrc})
# For each response, append ip and mac address to 'clients' list
print("~"*20)
print("-"*20)
print("Devices On This Network:")
print("-"*20)
print("Device" + " " * 4 + "IP Address")
#Text formatting
for client in clients:
if client['mac'].startswith(mac_key):
devsub(client['mac'])
#Running primary filter to only include MAC addresses that pass
# .startswith(mac_key) into devsub function to print device name
# Associated with MAC[9:11] variables, and the appropriate IP address
Так что это текущий вывод с 1 согласующее устройство