2011-05-30 18 views
7

Me preguntaba si alguien sabía de una forma de capturar y reconocer los comandos write entrantes a un terminal. Intenté usar script -f y luego usar tail -f para seguir la salida en un ciclo while pero debido a que el terminal que estoy rastreando no inicia el write, no sale. Desafortunadamente no tengo permisos de root y no puedo jugar con los pts o screendump, me preguntaba si alguien conocía un método para lograr esto.Respondiendo a los mensajes de "escritura"

Ejemplo:

Terminal 1 $ echo hello | write Terminal 2 

Terminal 2 $ 
Message from Terminal 1 on pts/0 at 23:48 ... 
hello 
EOF 

*Cause a trigger from which I can send a return message 

Respuesta

3

No puedo pensar en ninguna manera obvia de hacerlo. He aquí por qué ...

Su shell recibe su entrada desde, y envía su salida a, algunos terminales dispositivo:

+-----------+ 
    |   | 
    | bash | 
    |   | 
    +-----------+ 
     ^| 
     | | 
     | v 
     +----------------------+ 
     | some terminal device | 
     +----------------------+ 

Cuando write escribe al terminal, envía los datos directamente al mismo dispositivo terminal . No va a ninguna parte cerca de su shell:

+-----------+  +-----------+ 
    |   |  |   | 
    | bash |  | write | 
    |   |  |   | 
    +-----------+  +-----------+ 
     ^|    | 
     | |    | 
     | v    v 
     +----------------------+ 
     | some terminal device | 
     +----------------------+ 

Por lo tanto, con el fin de que usted sea capaz de captar lo que se envía por write, que había necesidad alguna de gancho proporcionada por el propio dispositivo terminal, y don No creo que haya nada que puedas usar para hacer esto.

Entonces, ¿cómo funciona script, y por qué no captura la salida write?

script tampoco se puede enganchar en el dispositivo terminal. Realmente quiere interponerse entre su shell y su terminal, pero no hay una buena manera de hacerlo directamente.

Por lo tanto, crea un nuevo dispositivo terminal (un pseudo-terminal, también conocido como "pty") y ejecuta un nuevo shell en el mismo. Una pty consta de dos lados: el "maestro", que es solo una secuencia de bytes, y un "esclavo", que se parece a cualquier otro dispositivo terminal interactivo.

La nueva cáscara se une a la parte del esclavo, y script controla el lado maestro - lo que significa que se puede ahorrar la corriente de bytes de un archivo, así como transmitirlas entre el nuevo shell y el terminal original:

+-----------+ 
    |   | 
    | bash | 
    |   | 
    +-----------+ 
     ^| 
     | | 
     | v 
+-----------------+ <=== slave side of pty -- presents the interface of 
| pseudo-terminal |        an interactive terminal 
+-----------------+ <=== master side of pty -- just a stream of bytes 
     ^|      
     | v  
    +-----------+ 
    |   | 
    | script | 
    |   | 
    +-----------+ 
     ^| 
     | | 
     | v 
     +----------------------+ 
     | some terminal device | 
     +----------------------+ 

Ahora se puede ver que un write al dispositivo terminal original, no pasa por todo, al igual que lo hizo en el caso simple de arriba:

+-----------+ 
    |   | 
    | bash | 
    |   | 
    +-----------+ 
     ^| 
     | | 
     | v 
+-----------------+ <=== slave side of pty -- presents the interface of 
| pseudo-terminal |        an interactive terminal 
+-----------------+ <=== master side of pty -- just a stream of bytes 
     ^|      
     | v  
    +-----------+  +-----------+ 
    |   |  |   | 
    | script |  | write | 
    |   |  |   | 
    +-----------+  +-----------+ 
     ^|    | 
     | |    | 
     | v    v 
     +----------------------+ 
     | some terminal device | 
     +----------------------+ 

Si escribe datos en el lado del esclavo de la nuevo terminal aquí, aparecerá la salida, porque aparecerá en la secuencia de datos en el lado principal, que script ve. Puede encontrar el nombre del nuevo pty con el comando tty del shell dentro de script.

Por desgracia, esto no ayuda con write, ya que probablemente no será capaz de write a ella: la sesión de conexión está asociado con el terminal original, no la nueva, y write probablemente se quejará de que' no has iniciado sesión. Pero si por ejemplo echo hello >/dev/pts/NNN, verá que aparece en la salida script.

+0

Gracias por la explicación larga y detallada, no me di cuenta de que 'script' funcionaba a través de un pseudo-terminal secundario, por lo que era interesante. Creo que intentaré invertir algo de tiempo para ver si obtengo el script para detectar el nuevo pty y lo uso original para mis propósitos, aunque tendré que intentar replicar la funcionalidad 'write' con algo que no se preocupa por el ID. –

Cuestiones relacionadas