Надеюсь, у вас все хорошо.
Мне интересно, могли бы вы помочь мне или указать мне правильное направление. В настоящее время я работаю над проектом, который сосредоточен вокруг управления сетью. Из-за жестких временных ограничений, где это возможно, я использую код с открытым исходным кодом. Проблема, с которой я столкнулся, заключается в том, что часть проекта требует, чтобы я мог захватывать MAC-адреса всех устройств, подключенных к сети.
Мои знания в области сетевого программирования ограничены, так как я работал в других областях разработки программного обеспечения в течение последних 4 лет. Подход, который я выбрал, заключается в использовании nmap в качестве основы для получения IP-адреса и другой необходимой мне информации. MAC-адрес не входит в состав nmap out, и из того, что я прочитал, он выглядит немного странным. (я могу ошибаться).
Поэтому я попытался сделать это в два этапа, во-первых, я получаю данные, включая IP-адрес из Nmap, который работает нормально. Мой следующий шаг и проблема, с которой я сталкиваюсь, это пинг IP-адреса (из моей программы на Python), который работает. Но как я могу получить MAC-адрес от IP-адреса? Сначала я подумал пропинговать ip и взять MAC из ARP, но думаю, что это будет работать только в том случае, если IP-адрес находится в той же подсети. Чтобы усугубить проблему при развертывании, в сети может быть до 5000 компьютеров, которые необходимо зарегистрировать. Чтобы показать вам мой подход к Python ping, вот код:
import pdb, os
import subprocess
import re
from subprocess import Popen, PIPE
# This will only work within the netmask of the machine the program is running on cross router MACs will be lost
ip ="192.168.0.4"
#PING to place target into system's ARP cache
process = subprocess.Popen(["ping", "-c","4", ip], stdout=subprocess.PIPE)
process.wait()
result = process.stdout.read()
print(result)
#MAC address from IP
pid = Popen(["arp", "-n", ip], stdout=PIPE)
s = pid.communicate()[0]
# [a-fA-F0-9] = find any character A-F, upper and lower case, as well as any number
# [a-fA-F0-9]{2} = find that twice in a row
# [a-fA-F0-9]{2}[:|\-] = followed by either a ?:? or a ?-? character (the backslash escapes the hyphen, since the # hyphen itself is a valid metacharacter for that type of expression; this tells the regex to look for the hyphen character, and ignore its role as an operator in this piece of the expression)
# [a-fA-F0-9]{2}[:|\-]? = make that final ?:? or ?-? character optional; since the last pair of characters won't be followed by anything, and we want them to be included, too; that's a chunk of 2 or 3 characters, so far
# ([a-fA-F0-9]{2}[:|\-]?){6} = find this type of chunk 6 times in a row
mac = re.search(r"([a-fA-F0-9]{2}[:|\-]?){6}", s).groups()[0] #LINUX VERSION ARP
mac = re.search(r"(([a-f\d]{1,2}\:){5}[a-f\d]{1,2})", s).groups()[0] #MAC VERSION ARP
print(mac)
Я искал некоторую информацию, но то, что я нашел, кажется немного расплывчатым. Если вы знаете какие-либо идеи или направления исследований, которые могут мне помочь, я был бы очень рад
Приветствия
Chris