surveiller le trafic des tubes interprocessus

13

J'ai deux processus Linux communiquant via un canal sans nom. Comment peut surveiller le trafic dans le tuyau? Comment puis-je injecter des données dans le tuyau? J'ai un accès root et je connais l'inode du tuyau.

jackhab
la source

Réponses:

7

Un canal sans nom est par nature privé aux applications qui ont le descripteur de fichier. Il n'y a aucun moyen de principe d'observer ou de modifier le trafic sur le tuyau. Je ne pense pas non plus qu'il y ait un moyen de regarder le tuyau directement sur Linux.

Il existe cependant un moyen sans principes de faire plus ou moins ce que vous recherchez: via l' appel système ptrace . Vous ne colleriez pas sur le tuyau en soi, mais sur l'un des processus. Pour l'observation, utilisez strace , par exemple

strace -p1234 -s99999 -e write

1234est l'ID de processus d'un processus qui écrit sur le tuyau. La modification des données est plus difficile, mais peut être effectuée. Je pense que le moyen le plus simple serait de configurer d'abord un processus intermédiaire qui copie son entrée standard sur sa sortie standard, plus les données que vous souhaitez injecter (et moins toutes les données que vous souhaitez supprimer). Créez deux canaux nommés et démarrez ce processus intermédiaire avec stdin sur un canal et stdout sur l'autre. Utilisez ensuite un débogueur (par exemple GDB ) pour faire exécuter les deux processus cibles opensur le canal nommé approprié, puis duppour placer le canal sur le descripteur de fichier approprié. Notez qu'il y a une chance que vous plantiez l'un des processus du processus.

(Si vous ne comprenez pas le dernier paragraphe, je suis désolé, mais il nécessite un certain niveau de technicité. Je ne pense pas qu'il existe un moyen plus facile.)

Gilles 'SO- arrête d'être méchant'
la source
Merci, je comprends. Ce que j'ai réellement essayé va dans / proc / $ PID / fd, où j'ai trouvé les entrées de fichier pour les canaux sans nom de l'un des processus et j'ai réussi à lire et à utiliser des données en utilisant simple cat et echo dans le shell, mais le comportement quelque peu inconsistant. Je dois enquêter davantage.
jackhab
1
@jackhab: Oh, je pensais que cela ne fonctionnait pas pour les tuyaux. Mais comme vous l'avez découvert, cela ne vous aidera pas beaucoup pour surveiller le trafic, car chaque octet du producteur ira à exactement un consommateur et vous ne pouvez pas contrôler si votre moniteur ou le consommateur réel l'obtiendra. Vous devriez alors pouvoir injecter des données de cette façon.
Gilles 'SO- arrête d'être méchant'
2

Quelques outils utiles pour surveiller un tuyau:

Pipe Viewer
tee

Pour un programme déjà en cours d'exécution où l'on ne contrôle pas la tuyauterie, voir la méthode gdb:
Rediriger la sortie d'un processus en cours d'exécution .

Ou on peut utiliser strace :

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

affiche uniquement les appels du descripteur 1. "2> & 1" consiste à rediriger stderr vers stdout, comme strace écrit par défaut vers stderr.

harrymc
la source
1
Ce que je voulais dire, c'est l'écoute électronique sur le canal du processus déjà en cours. Le processus A lance le processus B et parle avec lui via un tube, donc je n'ai aucun moyen d'utiliser des utilitaires proxy comme tee ou pv.
jackhab
Ajout de quelques méthodes supplémentaires.
harrymc
Plutôt que d'utiliser grep, vous pouvez spécifier "-e write = 1" pour limiter la sortie aux données écrites en fd 1.
William Pursell