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.
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
où 1234
est 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 open
sur le canal nommé approprié, puis dup
pour 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.)
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 :
affiche uniquement les appels du descripteur 1. "2> & 1" consiste à rediriger stderr vers stdout, comme strace écrit par défaut vers stderr.
la source