Mam dwa procesy Linuksa komunikujące się za pomocą bezimiennego potoku. Jak monitorować ruch w rurze? Jak mogę wstrzyknąć dane do potoku? Mam dostęp do katalogu głównego i znam i-węzeł potoku.
Rura bez nazwy jest z natury prywatna dla aplikacji, które mają deskryptor pliku. Nie ma zasadniczego sposobu obserwowania lub modyfikowania ruchu na rurze. Nie sądzę też, aby można było spojrzeć na potok bezpośrednio w systemie Linux.
Istnieje jednak prosty sposób robienia mniej więcej tego, czego szukasz: poprzez wywołanie systemowe ptrace . Nie przylgnąłbyś do rury jako takiej, ale do jednego z procesów. Do obserwacji użyj strace , np
strace -p1234 -s99999 -e write
gdzie 1234
jest identyfikatorem procesu, który zapisuje na potoku. Modyfikowanie danych jest trudniejsze, ale można to zrobić. Myślę, że najprościej byłoby najpierw skonfigurować proces pośredni, który kopiuje standardowe dane wejściowe na standardowe dane wyjściowe, a także dane, które chcesz wstrzyknąć (i pomniejszone o dane, które chcesz ukryć). Utwórz dwie nazwane rury i rozpocznij ten pośredni proces ze stdin na jednej rurze i stdout na drugiej. Następnie użyj debuggera (np. GDB ), aby oba procesy docelowe były wykonywane open
na odpowiednio nazwanym potoku, a następnie dup
umieść potok na odpowiednim deskryptorze pliku. Pamiętaj, że istnieje ryzyko, że zawiesisz jeden z procesów w tym procesie.
(Jeśli nie rozumiesz ostatniego akapitu, przepraszam, ale wymaga pewnego poziomu techniki. Nie sądzę, że istnieje łatwiejszy sposób.)
Niektóre narzędzia przydatne do monitorowania potoku:
Rura Viewer
tee
W przypadku już działającego programu, w którym nie kontroluje się potokowania, zobacz metodę gdb:
Przekierowanie danych wyjściowych z uruchomionego procesu .
Lub można użyć strace :
pokazuje tylko wywołania deskryptora 1. „2> i 1” oznacza przekierowanie stderr na stdout, ponieważ strace domyślnie zapisuje na stderr.
źródło