Получение статистики сокета TCP с Python? - PullRequest
1 голос
/ 05 января 2020

Можно ли использовать модуль Python socket для репликации некоторых функций утилиты Linux ss ?

ss используется для вывода статистики сокетов. Позволяет показывать информацию, аналогичную netstat. Он может отображать больше информации о TCP и состоянии, чем другие инструменты.

Практически вся документация socket вращается вокруг создания новых сокетов, но я не могу найти информацию о получении статистики из системных сокетов.

1 Ответ

2 голосов
/ 06 января 2020

Я не понимаю, как такая функциональность может быть реализована исключительно с помощью модуля socket. Модуль socket предназначен для работы непосредственно с сокетами: открытие / закрытие, отправка / получение и т. Д. c. Это просто тонкая оболочка над стандартным интерфейсом сокетов BSD.

С другой стороны, получение метаданных о существующих сокетах, уже размещенных в системе, требует знания других процессов, работающих в системе. Это имеет мало общего с фактическим манипулированием сокетом, и гораздо больше связано с мониторингом других процессов и / или их файловых дескрипторов.

Например, кажется, что и ss, и netstat фактически реализованы (по крайней мере, на Linux) путем чтения и анализа псевдофайловой системы /proc. (См. здесь и здесь , например.) Ядро управляет процессами и их открытыми сокетами и предоставляет (некоторые из) информацию о них другим процессам через procfs. Это обеспечивает простой и безопасный способ экспорта некоторой информации о процессах в пространство пользователя, избавляя от необходимости большого количества системных вызовов или непосредственного чтения структур данных ядра.

Обратите внимание, что в значительной степени имеет работать таким образом. Строгая изоляция процесса требует, чтобы информация об открытых файлах другого процесса, включая сокеты, каким-то образом проходила через ядро. Это может быть либо через procfs на Linux, либо через какой-либо API, предоставляемый ядром (например, libproc на macOS). Все остальное будет огромной дырой в безопасности.

В качестве альтернативы модулю socket, вы можете попробовать пакет psutil или что-то подобное. Функция psutil.net_connections() кажется подходящей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...