Як дізнатися більше про файли сокетів в / 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 socket", як я розкопаюсь у тому, що таке 0xffff88002704d380?
benhsu

1
"unix 0xfff ..." схоже на адресу пам'яті ядра структури unix_sock. Ця структура містить вказівник на точку вашого сокета. Погляньте grep -rni ffff88002704d380 /proc. десь під / proc / може лежати ваша відповідь, catваш файл grep знайдений. Але не чіпайте мене на це ... Можливо, тут буде жахливо не так.
піді

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