Как узнать больше о файлах сокетов в / proc / fd?


33

Глядя в / proc / $ mypid / fd /, я вижу эти файлы

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]

Поскольку у меня есть доступ к коду, я знаю, что эти сокеты привязаны к TCP-соединениям (одно - это соединение с портом 5672 на некоторой машине, другое - соединение с портом 3306 на какой-то другой машине), но я хочу знать, какой сокет к какой связи привязан. Как я могу это сделать?

В целом, как я могу спросить ОС, что находится на другом конце сокета?


1
Используйте socat....
Heemayl

Ответы:


40

Команда lsof

Хороший вариант может быть lsof. Как man lsofговорится, это удобно для получения информации о open files such as Internet sockets or Unix Domain sockets.


Используй это

Сначала получите обзор /proc/$PID/fd/и список номеров сокетов.
Например, socket:[14240]может вас заинтересовать.

Затем используйте lsof -i -a -p $PIDдля печати списка всех сетевых файлов $PID.

  • -i создает список сетевых файлов, принадлежащих пользователю или процессу

  • -a логически объединяет или заданные параметры AND

  • -p $PID выбирает информацию только о вашем процессе

Типичный вывод для моего браузера, работающего с PID 2543:

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)

и больше похожих строк.

Большой! Теперь присмотритесь к DEVICEколонне. Это соответствует нашему ранее перечисленному сокету от /proc/$PID/fd/!
И благодаря NAMEразделу мы можем сказать, что другой конец нашего сокета.

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

Я почти уверен, что можно объединить все команды, но этого должно быть достаточно, чтобы вы начали.


Спасибо! Проголосовал и принял. Я вижу сокет, отображаемый в lsof как «сокет unix 0xffff88002704d380 0t0 1423733559», как мне найти 0xffff88002704d380?
benhsu

1
"unix 0xfff ..." выглядит как адрес памяти ядра структуры unix_sock. Эта структура содержит указатель на вашу конечную точку сокета. Посмотрите на grep -rni ffff88002704d380 /proc. где-то в / proc / может лежать ваш ответ, catваш файл grep найден. Но не связывай меня с этим ... Может быть, это ужасно неправильно.
Пиди

lsofсчитывает другую информацию о гнезде из /proc/net/tcp, /proc/net/tcp6, /proc/net/udp, и так далее в зависимости от типа сокета.
Йесин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.