стежити за міжпроцесорним трафіком


13

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

Відповіді:


7

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

Однак існує безпринципний спосіб більш-менш робити те, що ви хочете: через системний виклик ptrace . Ви б не торкалися на трубу як такої, а на один із процесів. Для спостереження використовуйте шнур , наприклад

strace -p1234 -s99999 -e write

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

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


Спасибі, я розумію. Те, що я насправді спробував, - це / proc / $ PID / fd, де я знайшов записи файлів для безіменних труб одного з процесів, і мені вдалося прочитати та дані за допомогою простого кота та відлуння в оболонці, але поведінка дещо непослідовний. Мені потрібно далі дослідити.
джекхаб

1
@jackhab: О, я думав, це не працює для труб. Але, як ви дізналися, це не дуже допоможе вам для моніторингу трафіку, тому що кожен байт від виробника буде спрямований саме на одного споживача, і ви не можете контролювати, чи отримає його монітор чи власний споживач. Ви повинні мати можливість вводити дані таким чином.
Жил "ТАК - перестань бути злим"

2

Деякі інструменти, корисні для спостереження за трубою:

Труба перегляду
трійник

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

Або можна використовувати штрих :

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

показує лише дескриптор 1 викликів. "2> & 1" - це перенаправити stderr на stdout, як strace записує в stderr за замовчуванням.


1
Я мав на увазі підключення до труби вже запущеного процесу. Процес A запускає процес B і спілкується з ним по трубі, тому я не можу використовувати проксі-сервіси, такі як tee або pv.
джекхаб

Додано ще кілька методів.
harrymc

Замість використання grep, ви можете вказати "-e write = 1", щоб обмежити вихід на дані, записані на fd 1.
William Pursell
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.