Самый простой способ чтения Linux ARP таблицы с использованием кода / Python - PullRequest
0 голосов
/ 18 марта 2020

У меня есть сценарий Python, работающий на Linux, который должен многократно и надежно читать таблицу ARP, чтобы проверить некоторые ассоциации IP-MA C. Я оцениваю возможные варианты и задаюсь вопросом, какой из них является наименьшим / самым чистым - в первую очередь с точки зрения производительности и накладных расходов.

В настоящее время на моем радаре:

  1. Запустите arp -an, используя subprocess и проанализируйте вывод
  2. Считайте /proc/net/arp и проанализируйте вывод (аналогично # 1, но другой способ получить базовые данные; библиотеки, такие как python_arptable do именно так)
  3. Откройте сокет и используйте системный вызов SIOCGARP ioctl для опроса таблицы ARP (за http://man7.org/linux/man-pages/man7/arp.7.html). У меня пока нет реализации Python для этого, но я думаю, что это было бы возможно.
  4. Запустите ip neighbor list, используя subprocess и проанализируйте вывод
  5. Используйте 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) отличается от других?
...