Linux: Capture la sortie d’un processus en cours d’exécution (en C pur!)

Ma situation est la suivante: j’ai beaucoup de petits gizmos (assez proches des routeurs, pas exactement, mais de toute façon, ce n’est pas pertinent); ils exécutent une dissortingbution Linux sans système d’exploitation basée sur MIPS.

Pour les contrôler, vous pouvez y établir une connexion telnet (via le port série) et envoyer des commandes à un shell interactif similaire à bash, qui enregistre ensuite une sortie. Les entrées et sorties du shell sont toutes deux attachées à / dev / ttyAS0.

Maintenant, j’aimerais automatiser tout cela, c’est-à-dire écrire un programme qui s’exécutera dans le gizmo, être un petit serveur écoutant sur un port, et qui transmettrait n’importe quelle commande au dit shell, capturerait la sortie du shell et le relayer Retour à celui qui a contacté au serveur.

JE:

1) peut installer (petits, <500 Ko) des programmes à l'intérieur du gizmo 2) ne peut pas modifier le système d'exploitation, les scripts de démarrage, le shell, 3) avoir un accès root 4) savoir comment écrire un serveur SOAP 5) savoir comment obtenir un message SOAP, traduisez-le en une commande et injectez-le dans / dev / ttyAS0 6) NE SAIS PAS comment capturer la réponse du shell 7) sait comment, avoir la réponse du shell, le traduire en un message SOAP et répondre à l'enquêteur d'origine .

Donc, fondamentalement, le problème est 6): comment, après avoir injecté une chaîne dans / dev / ttyAS0 et donc obligé le shell à l’exécuter, capturer la sortie du shell?

je suis conscient de

Redirecting Output from a Running Process

c’est-à-dire que je sais que je pourrais changer la sortie standard du shell si GDB (ou strace) s’exécutait à l’intérieur de la boîte, mais je ne peux pas l’installer là-bas – c’est trop gros et de toute façon cette approche ressemble trop à un hack.

Donc, résumant:

Comment root peut-il capturer la sortie standard d’un processus en cours d’exécution, IN PURE C, sans gdb ou strace, sans access au mode de démarrage du processus?

Ou, de manière presque équivalente, comment capturer ce qui est écrit sur un terminal, IN PURE C?

Vous voudrez peut-être jeter un coup d’œil à reptyr . Il faudra probablement une certaine adaptation pour que votre système fonctionne

Avez-vous essayé de piloter le port série avec un script kermit ? Je voudrais probablement renoncer à essayer d’insérer un proxy plus intelligent sur le périphérique et simplement essayer de gérer l’interface existante.

Si vous voulez vraiment le télécharger sur votre appareil, vous pourrez peut-être consulter la source de quelque chose comme screen ou kermit pour avoir une idée de la façon dont ils interagissent avec ttys.