У меня есть два процесса Linux, взаимодействующих через безымянный канал. Как можно следить за трафиком в трубе? Как я могу ввести данные в канал? У меня есть доступ с правами root и я знаю трубу inode
Безымянный канал по своей природе является частным для приложений, имеющих дескриптор файла. Нет принципиального способа наблюдать или изменять трафик на канале. Я не думаю, что есть способ взглянуть на канал непосредственно в Linux.
Однако существует беспринципный способ более или менее делать то, что вам нужно: через системный вызов ptrace . Вы бы не привязывались к трубе как таковой, а к одному из процессов. Для наблюдения используйте strace , например
strace -p1234 -s99999 -e write
где 1234
идентификатор процесса, который пишет в канал. Изменить данные сложнее, но можно сделать. Я думаю, что самым простым способом было бы сначала настроить промежуточный процесс, который копирует его стандартный ввод в стандартный вывод, плюс данные, которые вы хотите ввести (и минус любые данные, которые вы хотите подавить). Создайте два именованных канала и запустите этот промежуточный процесс с помощью stdin на одном канале и stdout на другом. Затем используйте отладчик (например, GDB ), чтобы оба целевых процесса выполнялись open
в соответствующем именованном канале, затем dup
поместите канал в соответствующий файловый дескриптор. Обратите внимание, что есть вероятность того, что вы сломаете один из процессов в этом процессе.
(Если вы не понимаете последний абзац, извините, но он требует определенного уровня техники. Я не думаю, что есть более простой способ.)
Некоторые инструменты, полезные для мониторинга канала:
Тройник для просмотра труб
Для уже работающей программы, в которой никто не контролирует трубопровод, см. Метод gdb:
перенаправление вывода из запущенного процесса .
Или можно использовать strace :
показывает только дескриптор 1 вызовов. «2> & 1» - перенаправить stderr в stdout, так как strace записывает в stderr по умолчанию.
источник