Назад | Перейти на главную страницу

Обнюхивать сокет домена UNIX

Я знаю, что какой-то процесс выполняет запись в определенный сокет домена unix (/var/run/asterisk/asterisk.ctl), но pid отправителя мне неизвестен. Как узнать, кто пишет в сокет? Я пробовал:

sudo lsof /var/run/asterisk/asterisk.ctl

но это просто список владельца сокета. Я хотел бы знать, кто пишет / читает в этот сокет, и я также хотел бы понюхать данные. Это возможно?

Да, ты можешь это сделать. Все, что вам нужно, это systemtap.

Рассмотрим один из примеры скриптов systemtap который будет распечатать PID и имя процесса любой программы, которая читает или записывает указанный inode (и ваш сокет домена Unix как раз такой).

Вы можете тривиально изменить этот сценарий, чтобы распечатать фактические данные, которые читаются / записываются; Я оставлю это в качестве упражнения для читателя.

Короткие ответы - нет, и их нелегко.

В Linux lsof полагается на /proc/net/unix для получения информации о сокетах домена UNIX. В этом интерфейсе перечислены все связанные сокеты, но в нем не отслеживать конечные точки. Так что вы жестяная банка видеть, какие сокеты существуют, но не видно, что к ним подключено. Где-то эта информация является отслеживается, это необходимо отслеживать, иначе соединения сокетов не будут работать. Мне еще предстоит найти какой-либо механизм для получения информации о соединении.

Вопрос обнюхивания немного интереснее, но не менее разочаровывающе. Под «нелегко» я имел в виду то, что не существует никакого крючка, чтобы проникнуть и захватить эти данные. Ближайший аналог - tcpdump или Wireshark, оба из которых используют libpcap для выполнения самой тяжелой работы. Хотя сеть (AF_INET) и домен UNIX (AF_UNIX) создаются с использованием socket() вызов функции, оба используют connect() для подключения оба используют read() и write() для обработки данных они обрабатываются разными подсистемами ядра. Это имеет неприятный побочный эффект: libpcap не предназначен для работы с сокетами домена UNIX.

Есть несколько менее тусклая сторона проблемы. Взгляните на страницу руководства для recv(2). Это системный вызов нижнего уровня, который read() использует. Есть флаг для recv() называется MSG_PEEK. Это позволит вам прослушивать трафик, проходящий через сокет домена UNIX. Так что это яркая сторона, темная сторона заключается в том, что, насколько мне известно, не существует ни одного приложения, предназначенного для этого. Итак, вы смотрите на некоторые разработки.

Я очень хочу там был хороший простой ответ F'YEAH на обе части вашего вопроса.

Я знаю, что это не ответ на главный вопрос, но я оказался здесь в поисках просто прослушивания сообщений в сокете. Я решил написать для других, как я. Вот как я это сделал:

$> sudo socat -t100 -x -v UNIX-LISTEN: /var/run/php5-fpm.sock.socat,mode=777,reuseaddr,fork UNIX-CONNECT: /var/run/php5-fpm.sock

Вы можете удалить -x и просто оставить -v для связи ascii. Надеюсь, это кому-то поможет.

socat -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

Нет ни дублирования вывода, ни циклического вывода. Ошибка предыдущего комментария ".sock.socat"