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