Есть ли способ идентифицировать PID (или группу) сокета без повторения всех процессов в / proc /

Мне нужно определить группу процесса, заданного сокетом. В частности, у меня есть процесс на том же компьютере, который вызывает мой процесс с помощью tcp, и мне нужно определить процесс или его группу. Требование tcp заключается в том, что я имитирую сторонний API. Мне нужно вернуть разные данные в зависимости от того, какой процесс вызывает меня. Одним из решений является определение сокета с использованием / proc / net / tcp, из которого я могу получить индексный дескриптор для сокета, а затем перебрать / proc / * / fd, чтобы найти этот индекс. Есть ли прямой способ сопоставления с inode (я предполагаю, sockfs) его PID без этой итерации?

В общем, чтобы найти то, что находится на другом конце сокета, вам нужно выполнить итерацию через /proc . Разумеется, это может означать, что для этого можно использовать существующий инструмент, такой как netstat , lsof или ss .

Причина этого в том, что сокет может быть открыт различными процессами. Как только процесс открыл сокет, он может развиваться, и дети могут изменять свои привилегии и переключаться на разные пространства имен. Также можно передавать файловые дескрипторы из процесса в несвязанный процесс, используя согласованные данные в unix-сокете. Таким образом, произвольные процессы могут иметь один и тот же сокет открытым. Существует не такая вещь, как «ПИД-код сокета», а только «ПИД-ы сокета».

Хотя это не доказывает, что нет способа перечислить PID с учетом сокета, было бы очень сложно создать такой интерфейс, особенно если учесть, что пользователи, не являющиеся root, не узнают, когда файлы открываются процессами работает как другой пользователь. Доступ через /proc обеспечивает безопасность через разрешения, и я не знаю о каком-либо другом интерфейсе для получения одинаковых данных. Кроме того, fuser , lsof , netstat и ss перечисляют /proc ; если бы был другой интерфейс, я бы ожидал, что кто-то его использует. Поэтому я уверен, что другого выхода нет.

если вы знаете номер порта tcp, вы можете использовать эту команду в своем терминале:

$ lsof | grep TCP | grep your_port_number

Например: lsof | grep TCP | grep 1234