контролировать межпроцессный трафик

13

У меня есть два процесса Linux, взаимодействующих через безымянный канал. Как можно следить за трафиком в трубе? Как я могу ввести данные в канал? У меня есть доступ с правами root и я знаю трубу inode

jackhab
источник

Ответы:

7

Безымянный канал по своей природе является частным для приложений, имеющих дескриптор файла. Нет принципиального способа наблюдать или изменять трафик на канале. Я не думаю, что есть способ взглянуть на канал непосредственно в Linux.

Однако существует беспринципный способ более или менее делать то, что вам нужно: через системный вызов ptrace . Вы бы не привязывались к трубе как таковой, а к одному из процессов. Для наблюдения используйте strace , например

strace -p1234 -s99999 -e write

где 1234идентификатор процесса, который пишет в канал. Изменить данные сложнее, но можно сделать. Я думаю, что самым простым способом было бы сначала настроить промежуточный процесс, который копирует его стандартный ввод в стандартный вывод, плюс данные, которые вы хотите ввести (и минус любые данные, которые вы хотите подавить). Создайте два именованных канала и запустите этот промежуточный процесс с помощью stdin на одном канале и stdout на другом. Затем используйте отладчик (например, GDB ), чтобы оба целевых процесса выполнялись openв соответствующем именованном канале, затем dupпоместите канал в соответствующий файловый дескриптор. Обратите внимание, что есть вероятность того, что вы сломаете один из процессов в этом процессе.

(Если вы не понимаете последний абзац, извините, но он требует определенного уровня техники. Я не думаю, что есть более простой способ.)

Жиль "ТАК - перестань быть злым"
источник
Спасибо, я понимаю. На самом деле я попытался перейти в / proc / $ PID / fd, где я нашел записи файла для безымянных каналов одного из процессов, и мне удалось прочитать и получить данные, используя простые команды cat и echo в оболочке, но поведение несколько противоречивы. Мне нужно расследовать дальше.
Джекхаб
1
@jackhab: О, я думал, что это не работает для труб. Но, как вы узнали, это не поможет вам в мониторинге трафика, потому что каждый байт от производителя пойдет ровно одному потребителю, и вы не сможете контролировать, получит ли его ваш монитор или реальный потребитель. Вы должны быть в состоянии ввести данные таким образом.
Жиль "ТАК ... перестать быть злым"
2

Некоторые инструменты, полезные для мониторинга канала:

Тройник для просмотра труб

Для уже работающей программы, в которой никто не контролирует трубопровод, см. Метод gdb:
перенаправление вывода из запущенного процесса .

Или можно использовать strace :

strace -ewrite -p $PID 2>&1 | grep "write(1"

показывает только дескриптор 1 вызовов. «2> & 1» - перенаправить stderr в stdout, так как strace записывает в stderr по умолчанию.

harrymc
источник
1
Я имел в виду прослушивание телефонных разговоров с уже запущенным процессом. Процесс A запускает процесс B и общается с ним по каналу, поэтому я не могу использовать прокси-утилиты, такие как tee или pv.
Джекхаб
Добавил еще несколько методов.
harrymc
Вместо того, чтобы использовать grep, вы можете указать «-e write = 1», чтобы ограничить вывод данными, записанными в fd 1.
Уильям Перселл