Pergunta

Eu tenho um processo Linux desenvolvido por terceiros que se comunica com um terminal. Para a depuração, quero ver a comunicação voltando.

Pode -se pensar cat faria o truque (para ver uma direção):

    ./third-party-app &
    cat /dev/tty

... mas não. Em vez de, cat Vai roubar metade dos dados destinados ao aplicativo, o que é praticamente inútil.

Terceiro-App é codificado para assumir /dev/tty.

Uma maneira que eu achei espionar a comunicação é renomear o /dev/tty dispositivo para, digamos, /dev/real_tty e criar um tubo nomeado chamado /dev/tty em seu lugar. Em seguida, correndo:

    cat /dev/real_tty | tee /dev/tty &

... pelo menos me deixarei ver a saída de /dev/real_tty, copiando os dados de /dev/real_tty para o tubo nomeado /dev/tty e stdout.

Esse tipo de trabalho, mas parece realmente desonesto e depende do truque de substituir o dispositivo. Também não funciona nas duas direções, porque os tubos nomeados apenas transportam dados em uma direção.

Qual é a maneira certa de fazer isso?

Se alguém está se perguntando, o dispositivo TTY é um link RS-232 para um microcontrolador. A informação não é sensível ou segura. Todos os processos (aplicação e espiões) podem ser executados como root.

Foi útil?

Solução

Você poderia dar uma olhada em slsnif. Faz exatamente o que você deseja ou se estiver interessado em escrever um, a fonte está disponível para ver como funciona.

Outras dicas

Você já pensou em usar strace/ltrace? Você pode ver as chamadas do sistema que está fazendo, em particular, você pode ver as chamadas de gravação/ioctl etc.

RS-232? Basta tocar nas linhas RXD/TXD/GND com clipes. Tem sido uma eternidade desde que vi qualquer dispositivo se preocupar com DCD, DTR, etc.

Existem algumas alternativas:

Faça você mesmo com o GDB: Redirecionando a saída de um processo em execução

Criopid Permite capturar o estado de um processo de execução no Linux e salvá -lo em um arquivo. Esse arquivo pode ser usado para retomar o processo posteriormente, após uma reinicialização ou mesmo em outra máquina.

Ponto de verificação multithread distribuído é uma ferramenta para verificar transparentemente o estado de um grupo arbitrário de programas espalhados por muitas máquinas e conectado por soquetes.

o script Existe um programa para fazer isso usando o Psudo-terminal. O dispositivo /dev/tty Geralmente é especial e refere -se ao terminal de controle do processo atual, portanto, você pode não ter que recorrer à renomeação de coisas.

script abre um Psudo-terminal e depois executa outra instância do seu shell com esse novo shell como seu terminal de controle (então /dev/tty refere-se a este terminal psudo para esta concha e seus processos infantis). A opção -c permite executar um comando específico em vez do seu shell.

O principal problema com script é que é impossível saber de que maneira os dados capturados no arquivo de saída (./typescript Por padrão) estava indo - os dados que fluem nos dois sentidos são despejados no mesmo arquivo e parecem semelhantes ao que aparece na tela ao usar um terminal interativo (exceto para incluir escapadas, retornos de carruagem e coisas patetas como essa, assim como as normalmente caracteres exibidos).

De qualquer forma, sei que essa pergunta já foi respondida há muito tempo, mas pensei que se alguém procurasse uma solução semelhante e não estava usando uma porta serial real, isso pode ajudá -los.

Não é simples (não para mim, pelo menos para mim), mas um mecanismo que deve funcionar para os drivers seriais TTY é um disciplina de linha.

As pessoas aqui já fizeram boas sugestões, mas aqui está outra:

Você também pode escrever uma biblioteca compartilhada com o seu próprio write() Isso funciona antes de ligar para o write() a partir de libc.so. Então você pode usar o LD_PRELOAD Variável de ambiente para carregar sua biblioteca quando o processo iniciar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top