Intercepta entrada e saída de um executável específico

6

Eu tenho um determinado executável do Linux que é chamado de um aplicativo maior para executar alguns cálculos. Eu quero modificar a forma como os cálculos são realizados, pois primeiro eu preciso entender como o executável é chamado e de que maneira os parâmetros e dados são transferidos.

Então, eu gostaria de monitorar os parâmetros de linha de comando, stdin e stdout se este executável for chamado. O funcionamento normal do executável não deve ser perturbado.

Existe uma maneira fácil de fazer isso?

Atualização:

Eu tentei a ideia de espaço reservado do shell script para pegar todos os dados usando o seguinte script:

#!/bin/bash
export LOGFILE=/tmp/logname
echo 'env' > $LOGFILE-env
echo "$@" >> $LOGFILE-arguments
tee -a $LOGFILE-stdin | /path/to/real/executable 2>&1 | tee -a $LOGFILE-stdout

Isso funciona bem para a entrada de teste, mas apenas trava se for chamado de real. Provavelmente há ainda mais acontecendo do que eu suspeitava.

    
por Mad Scientist 03.05.2011 / 10:37

4 respostas

6

A opção 1 seria modificar o código-fonte do aplicativo de chamada e inserir tee no pipeline de saída para obter uma cópia da saída para revisão nesse estágio.

A opção 2 seria escrever um script wrapper em torno do executável em questão. Um script rápido que passa stdin e argumentos para o aplicativo real, então tee a saída para um local para você rever e também cospe de volta da mesma forma que o aplicativo deve ser apenas algumas linhas para agitar. Coloque-o em algum lugar especial e adicione esse local à frente da sua variável PATH e, em seguida, execute seu aplicativo.

#!/bin/sh
cat - | /path/to/realapp $@ | tee /tmp/debug_output
    
por 03.05.2011 / 11:02
3

Você pode obter muitas informações sobre um programa chamando-o em strace . Isso mostra todas as chamadas do sistema que o programa faz, o que pode ser muita informação às vezes, mas pode ser uma grande ajuda para descobrir o que está errado.

A abordagem 1 é executar seu aplicativo grande em strace . Isso provavelmente produzirá muitos resultados e atrasará seu aplicativo.

strace -s9999 -efile,process -f -o bigapp.strace bigapp

Se o aplicativo grande for interativo, talvez você prefira iniciá-lo e conecte o strace a ele quando estiver pronto para acionar os cálculos. Observe o ID do processo do aplicativo, digamos 12345, e execute

strace -s9999 -efile,process -f -o bigapp-calculations.strace -p12345

Se for o suficiente para observar esse executável externo, então,   outro answers já sugeriu, substitua esse executável por um script de wrapper. Você pode mover o executável para um nome diferente e colocar o script de wrapper em seu lugar, ou colocar o script de wrapper à frente do executável usual no PATH , ou configurar o aplicativo para chamar seu script de wrapper em vez do executável comum, seja qual for é conveniente. Faça esse script de wrapper

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "$@"

Explicação dos parâmetros de strace usados:

  • -e seleciona as chamadas do sistema para rastreamento. Você pode especificar chamadas do sistema pelo nome ou usar algumas categorias, como file ( open , close , read , write ,…) e process ( fork , execve ,… ).
  • -f faz strace seguir garfos , ou seja, rastrear subprocessos, bem como o processo original.
  • -o seleciona o nome do arquivo que contém o rastreio. $$ é uma construção de shell que representa o ID do processo do shell (devido ao uso de exec no último script de wrapper, que também será o ID do processo do aplicativo auxiliar).
  • -s9999 faz com que exiba muitos bytes para read e write e outras chamadas.
por 03.05.2011 / 23:37
2

Em vez de alterar seu caminho, você deve mover o binário de seu interesse de "binary" para "binary.orig" e substituí-lo por um script. Você disse que está interessado nos argumentos, então você também vai querer escrevê-los em um arquivo. Você provavelmente também estará interessado na saída do comando "env". Ele despeja todas as variáveis de ambiente atualmente ativas. As variáveis de ambiente são frequentemente usadas por um programa para influenciar o comportamento de outro programa que ele chama.

    
por 03.05.2011 / 17:46
0

O seguinte funciona para mim:

cat - | tee /tmp/in.log | / path / to / realapp $ @ | tee /tmp/out.log

    
por 12.03.2016 / 01:25

Tags