Я знаю, что какой-то процесс выполняет запись в определенный сокет домена 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. Надеюсь, это кому-то поможет.
Нет ни дублирования вывода, ни циклического вывода. Ошибка предыдущего комментария ".sock.socat"