У меня есть сценарий Python, работающий на Linux, который должен многократно и надежно читать таблицу ARP, чтобы проверить некоторые ассоциации IP-MA C. Я оцениваю возможные варианты и задаюсь вопросом, какой из них является наименьшим / самым чистым - в первую очередь с точки зрения производительности и накладных расходов.
В настоящее время на моем радаре:
- Запустите
arp -an
, используя subprocess
и проанализируйте вывод - Считайте
/proc/net/arp
и проанализируйте вывод (аналогично # 1, но другой способ получить базовые данные; библиотеки, такие как python_arptable do именно так) - Откройте сокет и используйте системный вызов
SIOCGARP
ioctl для опроса таблицы ARP (за http://man7.org/linux/man-pages/man7/arp.7.html). У меня пока нет реализации Python для этого, но я думаю, что это было бы возможно. - Запустите
ip neighbor list
, используя subprocess
и проанализируйте вывод - Используйте Python Библиотека netlink, такая как pyroute2 для чтения таблицы
Если я не ошибаюсь, параметры # 1 и # 2 читают таблицу непосредственно из кэша ядра, а # 4 и # 5 использовать вызовы netlink; Я не совсем уверен, где находится № 3.
В течение некоторого времени я делал # 5 - в частности, с использованием pyroute2 - но испытывал некоторые проблемы с надежностью; например, записи ARP, которые определенно существуют, не перечислены. У меня осталось ощущение, что pyroute2 потенциально слишком мощен для простой задачи. В настоящее время я делаю # 2, и, кажется, пока он работает нормально, но мне интересно, есть ли лучший способ.
Хотя мой язык реализации Python, я считаю, что вопрос не сильно зависит от языка. c. Хотелось бы несколько указателей на плюсы и минусы выше. В частности:
- Лучше запустить команду и прочитать ее вывод или прочитать файл из
/proc
? (опция # 1 против # 2) - Ядро старой школы против netlink новой эры? (# 1/2 против # 4/5)
- Как подход ioctl (# 3) отличается от других?