Pregunta

Tengo un proceso de Linux desarrollada por un tercero que se comunica con un terminal. Para depurar Quiero ver la comunicación retroceder en el otro.

Uno podría pensar cat haría el truco (para ver una dirección):

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

... pero no es así. Más bien, cat va a robar la mitad de los datos destinados a la aplicación, que es más o menos valor.

terceros aplicación está codificada para asumir /dev/tty.

Una forma que encontré para espiar a la comunicación es cambiar el nombre del dispositivo /dev/tty a, por ejemplo, /dev/real_tty y crear un tubo llamado /dev/tty nombrado en su lugar. A continuación, ejecutar:

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

... al menos me deja ver la salida del /dev/real_tty, copiando los datos de /dev/real_tty a la /dev/tty canalización con nombre y stdout.

Este tipo de obras, pero se siente muy poco fiables, y se basa en el engaño de reemplazar el dispositivo. Tampoco funciona en ambas direcciones, debido a canalizaciones con nombre sólo llevan datos en una dirección.

¿Cuál es la forma correcta de hacer esto?

Si alguien se pregunta, el dispositivo TTY es un enlace RS-232 a un microcontrolador. La información no es sensible o asegurado. Todos los procesos de aplicación y (espías) pueden ejecutar como root.

¿Fue útil?

Solución

Se puede echar un vistazo a slsnif . Hace exactamente lo que quiere, o si está interesado en escribir uno usted mismo la fuente está disponible para ver cómo funciona.

Otros consejos

Ha considerado el uso strace / ltrace ? Se puede ver las llamadas al sistema que está haciendo, en particular, se puede ver la escritura / están realizando llamadas ioctl etc.

RS-232 ? Sólo tienes que pulsar las líneas RxD / TxD / GND con clips. Ha sido una eternidad desde que he visto en cualquier dispositivo, incluso se preocupan por DCD, DTR, etc.

Hay algunas alternativas:

Do Youself con GDB: Redirección de la salida de un proceso en ejecución

CryoPID le permite capturar el estado de un proceso que se ejecuta en Linux y guardarlo en un archivo. Este archivo puede ser utilizado para reanudar el proceso más adelante, ya sea después de un reinicio o incluso en otra máquina.

distribuida multiproceso puntos de control es una herramienta de forma transparente los puntos de control del estado de un grupo arbitrario de los programas de difusión a través de muchas máquinas y conectado por sockets.

El programa existe script hacer esto utilizando psudo-terminal. El dispositivo es por lo general /dev/tty especial y se refiere al proceso actual de la terminal de control, por lo que no puede haber tenido que recurrir al cambio de nombre de las cosas.

script abre una psudo-terminal y luego ejecuta otra instancia de su cáscara con que la nueva cáscara como su terminal de control (por lo /dev/tty se refiere a este psudo-terminal de esta cáscara y sus procesos secundarios). La opción -c permite ejecutar un comando en particular en lugar de su caparazón.

El principal problema con script es que es imposible decir de qué manera los datos capturados en el archivo de salida (./typescript por defecto) que estaba pasando - los datos que circulan en ambos sentidos se vuelca en el mismo archivo y tiene una apariencia similar a la que aparece en la pantalla cuando se utiliza un terminal interactivo (excepto para la inclusión de escapes, retornos de carro y cosas torpe como que, así como los caracteres de la imagen normalmente).

De todos modos, sé que esta pregunta hace tiempo que ha sido contestada, pero pensé que si alguien fuera a buscar una solución similar y no se utiliza un puerto serie real esto puede ayudar a ellos.

No es sencillo (no para mí al menos), sino un mecanismo que debe funcionar para los controladores serie TTY es un línea de la disciplina .

Las personas que aquí ya se han hecho buenas sugerencias, pero aquí hay otra:

También puede escribir una biblioteca compartida con su propio write() que hace algún trabajo antes de llamar al write() de libc.so. A continuación, puede utilizar la variable de entorno LD_PRELOAD para cargar la biblioteca cuando se inicia el proceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top