9

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

2 ответа2

7

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

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

strace -p1234 -s99999 -e write

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

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

2

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

Просмотрщик труб
тройник

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .