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

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

12
задан 31.10.2011, 07:51

2 ответа

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

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

strace -p1234 -s99999 -e write

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

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

7
ответ дан 07.12.2019, 12:04

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

Средство просмотра канала
мишень

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

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

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

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

2
ответ дан 07.12.2019, 12:04

Теги

Похожие вопросы