GNU/Linux >> Tutoriales Linux >  >> Linux

Interceptar entrada y salida de un ejecutable específico

La opción 1 sería modificar el código fuente de la aplicación de llamada e insertar tee en la tubería de salida para obtener una copia de la salida para su revisión en esa etapa.

La opción 2 sería escribir un script contenedor alrededor del ejecutable en cuestión. Una secuencia de comandos rápida que transmite la entrada estándar y los argumentos a la aplicación real, luego envía la salida a una ubicación para que la revise y también la escupe de la misma manera que la aplicación debería tener solo un par de líneas para preparar. Póngalo en un lugar especial y agregue esa ubicación al frente de su variable PATH, luego ejecute su aplicación.

#!/bin/sh
cat - | /path/to/realapp [email protected] | tee /tmp/debug_output

Puede obtener mucha información sobre un programa llamándolo bajo strace . Esto muestra cada llamada al sistema que hace el programa, lo que a veces puede ser demasiada información, pero puede ser de gran ayuda para encontrar lo que está mal.

El enfoque uno es ejecutar su gran aplicación bajo strace . Es probable que esto genere muchos resultados y ralentice su aplicación.

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

Si la aplicación grande es interactiva, es posible que prefiera iniciarla y conectar strace una vez que esté listo para activar los cálculos. Anote el ID de proceso de la aplicación, digamos 12345, y ejecútelo

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

Si es suficiente observar ese ejecutable externo, entonces, como ya han sugerido otras respuestas, reemplace ese ejecutable por un script de contenedor. Puede mover el ejecutable a un nombre diferente y colocar la secuencia de comandos contenedora en su lugar, o colocar la secuencia de comandos contenedora delante del ejecutable habitual en el PATH , o configure la aplicación para llamar a su script contenedor en lugar del ejecutable habitual, lo que sea conveniente. Haz ese script de envoltura

#!/bin/sh
exec strace -s9999 -efile -o auxapp-$$.strace /path/to/original/executable "[email protected]"

Explicación de los parámetros de seguimiento utilizados:

  • -e selecciona las llamadas del sistema a rastrear. Puede especificar las llamadas al sistema por nombre o usar algunas categorías como file (open , close , read , write , …) y process (fork , execve , …).
  • -f hace que strace siga bifurcaciones, es decir, rastrea subprocesos así como el proceso original.
  • -o selecciona el nombre del archivo que contiene la traza. $$ es una construcción de shell que representa el ID del proceso de shell (debido al uso de exec en la última secuencia de comandos contenedora, ese también será el ID de proceso de la aplicación auxiliar).
  • -s9999 hace que muestre tantos bytes para read y write y otras llamadas.

En lugar de cambiar su ruta, debe mover el binario que le interesa de "binary" a "binary.orig" y luego reemplazarlo con un script. Usted dijo que está interesado en los argumentos, por lo que también querrá escribirlos en un archivo. Probablemente también le interese el resultado del comando "env". Vuelca todas las variables de entorno actualmente activas. Las variables de entorno suelen ser utilizadas por un programa para influir en el comportamiento de otro programa al que llama.


Linux
  1. Trabajar con entrada, salida y redirección de errores en Linux

  2. Cómo capturar sesiones de terminal y salida con el comando de script de Linux

  3. ¿Cómo funcionan la entrada de teclado y la salida de texto?

  4. ¿Eliminar los caracteres de control (incluidos los códigos/colores de la consola) de la salida del script?

  5. ¿Forzar salida a entrada (búfer) como “33[6n” en un script?

Cómo ejecutar comandos desde la entrada estándar usando Tee y Xargs en Linux

Explicación de la redirección de entrada y salida en Linux

¿Cómo ver la salida de un script PHP?

Explicado:entrada, salida y redirección de errores en Linux

Shell Scripting Parte 4:entrada, salida y redirección

Cómo extraer un valor (en una fila y columna específicas) de un archivo y asignarlo a una nueva variable