Linux: Capture a saída de um processo já em execução (em puro C!)
Minha situação é a seguinte: Eu tenho muitos aparelhos pequenos (bem perto dos roteadores, não exatamente, mas de qualquer maneira isso é irrelevante); eles estão executando uma distribuição Linux básica do MIPS.
Para controlá-los, pode-se telnetar lá (através da porta serial) e emitir comandos para um shell interativo do tipo bash, que depois grava de volta alguma saída. A entrada e a saída do shell estão anexadas a / dev / ttyAS0.
Agora, eu gostaria de automatizar tudo isso, ou seja, escrever um programa que será executado dentro do dispositivo, seja um pequeno servidor escutando alguma porta e que repasse qualquer comando para o referido shell, capture a saída do shell e retransmita-o de volta para quem entrou em contato com o servidor.
EU:
1) pode instalar (pequenos, <500KB) programas dentro do dispositivo 2) não pode modificar o SO, scripts de inicialização, shell, qualquer coisa 3) ter acesso root 4) saber como escrever um servidor SOAP 5) saber como obter uma mensagem SOAP, traduza-a em um comando e injete-a em / dev / ttyAS0 6) NÃO SABE capturar a resposta do shell 7) saiba como, tendo a resposta do shell, traduza-a novamente em uma mensagem SOAP e responda ao solicitante original .
Então, basicamente, o problema é 6): como, tendo injetado uma string no / dev / ttyAS0 e, assim, tendo feito o shell executá-lo, capturar a saída do shell?
Estou ciente
http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/
ou seja, eu sei que eu poderia mudar o stdout do shell se tivesse o GDB (ou strace) rodando dentro da caixa, mas não consigo instalá-lo lá - é muito grande e, de qualquer forma, essa abordagem parece muito com um hack.
Então, resumindo:
Como o root pode capturar o stdout de um processo já em execução, IN PURE C, sem gdb ou strace, sem acesso à maneira como o processo é iniciado?
Ou - quase equivalente - como capturar o que está sendo gravado em um terminal, IN PURE C?