2008-11-20 8 views
5

Estoy trabajando en un controlador de aplicación para un programa que está escupiendo texto directamente a/dev/tty.Capturando una redirección directa a/dev/tty

Este es un controlador de aplicación de producción que debe poder capturar todo el texto que va al terminal. En general, esto no es un problema. Simplemente redirigimos stdout y stderr. Esta aplicación particular realiza llamadas directas para hacer eco y redirigir el resultado a/dev/tty (echo "some text" > /dev/tty). Los redireccionamientos a través de mi controlador de aplicación no captan el texto.

Tengo la fuente para esta aplicación, pero no estoy en posición de modificarla, ni se está manteniendo. ¿Alguna idea sobre cómo atrapar y/o tirar la producción?

Respuesta

2

yo no puedo determinar si el programa screen mencionado por @flolo hará lo que usted necesita o no. Puede, pero no estoy seguro si hay una instalación de registro integrada, que parece ser lo que necesita.

Probablemente ya exista un programa para hacer lo que necesita. Nominaría sudosh como una posibilidad.

Si termina necesitando escribir el suyo, probablemente necesite usar un pseudo-tty (pty) y tenga su controlador de aplicación entre la conexión de terminal real del usuario y el dispositivo pequeño, donde pueda Registre lo que necesite para iniciar sesión. Eso no es trivial. Puede encontrar información sobre esto en el libro "Advanced UNIX Programming, 2nd Edn" de Rochkind, y sin duda otros libros similares (el libro "Programación avanzada en el entorno UNIX" de Stevens es un posible candidato, pero no tengo una copia para verificarlo).

4
screen -D -m yourEvilProgram 

debería funcionar. Pasó mucho tiempo sincelado lo usé, pero si necesita leer algo de su salida, incluso podría ser posible que pueda utilizar algunos enchufes para leerlo.

[ Agregado: dos enlaces, Rackaid y Pixelbeat, y la página de inicio en GNU]

3

La solución clásica para controlar una aplicación como esta es Expect, que configura pseudo-terminales, registra y maneja la aplicación controlada desde un script. Viene con muchos scripts de muestra, por lo que probablemente solo pueda adaptar uno para que se ajuste a sus necesidades.

3

Esto es lo que hice en Python

import pty, os 

pid, fd = pty.fork() 
if pid == 0: # In the child process execute another command 
    os.execv('./my-progr', ['']) 
    print "Execv never returns :-)" 
else: 
    while True: 
     try: 
      print os.read(fd,65536), 
     except OSError: 
      break 
Cuestiones relacionadas