monitorar tráfego de canal interprocessual

13

Eu tenho dois processos Linux se comunicando através de um canal sem nome. Como pode monitorar o tráfego no tubo? Como posso injetar dados no tubo? Eu tenho acesso root e conheço o inode pipe.

jackhab
fonte

Respostas:

7

Um canal sem nome é, por natureza, privado para os aplicativos que possuem o descritor de arquivo. Não existe uma maneira baseada em princípios de observar ou modificar o tráfego no tubo. Também não acho que haja uma maneira de ver o canal diretamente no Linux.

Existe uma maneira sem princípios de fazer mais ou menos o que você procura : através da chamada do sistema ptrace . Você não estaria aderindo ao tubo por si só, mas a um dos processos. Para observação, use strace , por exemplo

strace -p1234 -s99999 -e write

onde 1234é o ID do processo que grava no canal. Modificar os dados é mais difícil, mas pode ser feito. Eu acho que a maneira mais fácil seria primeiro configurar um processo intermediário que copie sua entrada padrão para sua saída padrão, mais os dados que você deseja injetar (e menos os dados que deseja suprimir). Crie dois pipes nomeados e inicie esse processo intermediário com stdin em um pipe e stdout no outro. Em seguida, use um depurador (por exemplo, GDB ) para executar os dois processos de destino openno pipe nomeado apropriado e, em seguida, dupcoloque o pipe no descritor de arquivo apropriado. Observe que há uma chance de você travar um dos processos no processo.

(Se você não entende o último parágrafo, desculpe, mas exige um certo nível de tecnicidade. Não acho que exista uma maneira mais fácil.)

Gilles 'SO- parar de ser mau'
fonte
Obrigado, eu entendo. O que realmente tentei foi em / proc / $ PID / fd, onde encontrei as entradas de arquivo para os pipes não nomeados de um dos processos e consegui ler e dados usando cat e eco simples no shell, mas o comportamento foi um pouco inconsistente. Eu preciso investigar mais.
jackhab
11
@jackhab: Ah, eu pensei que não funcionava para tubos. Mas, como você descobriu, não ajudará muito no monitoramento do tráfego, porque cada byte do produtor irá para exatamente um consumidor e você não pode controlar se o seu monitor ou o consumidor real o conseguirá. Você deve poder injetar dados dessa maneira.
Gilles 'SO- stop be evil'
2

Algumas ferramentas úteis para monitorar um pipe:

T do visualizador de tubos

Para um programa já em execução em que não se controla a tubulação, consulte o método gdb:
Redirecionando a saída de um processo em execução .

Ou pode-se usar strace :

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

mostra apenas as chamadas do descritor 1. "2> & 1" é redirecionar stderr para stdout, como strace grava no stderr por padrão.

harrymc
fonte
11
O que eu quis dizer é escutas telefônicas para o tubo do processo já em execução. Processo A inicia o processo B e conversa com ele por meio de um canal, de modo que não tenho como usar utilitários de proxy como tee ou pv.
jackhab
Adicionado mais alguns métodos.
harrymc
Ao invés de usar grep, você pode especificar "write -e = 1" para limitar a saída de dados gravados fd 1.
William Pursell