2008-11-20 12 views
5

Je travaille sur un contrôleur d'application pour un programme qui crache du texte directement dans/dev/tty.Attraper une redirection directe vers/dev/tty

Il s'agit d'un contrôleur d'application de production qui doit être en mesure d'intercepter tout le texte envoyé au terminal. Généralement, ce n'est pas un problème. Nous redirigeons simplement stdout et stderr. Cette application particulière effectue des appels directs à echo et redirige le résultat vers/dev/tty (echo "some text" > /dev/tty). Les redirections via mon contrôleur d'application n'atteignent pas le texte.

J'ai la source pour cette application, mais je ne suis pas en mesure de la modifier et elle n'est plus maintenue. Des idées sur comment attraper et/ou jeter la sortie?

Répondre

2

Je ne peux pas déterminer tout à fait si le programme screen mentionné par @flolo fera ce dont vous avez besoin ou non. Peut-être, mais je ne sais pas s'il y a une installation d'exploitation forestière qui semble être ce dont vous avez besoin.

Il existe probablement déjà un programme pour faire ce dont vous avez besoin. Je nommerais sudosh comme une possibilité. Si vous finissez par avoir besoin d'écrire le vôtre, vous aurez probablement besoin d'utiliser un pseudo-tty (pty) et d'avoir votre contrôleur d'application assis entre la vraie connexion du terminal de l'utilisateur et le périphérique pty, où il peut connectez-vous à tout ce dont vous avez besoin pour vous connecter. Ce n'est pas trivial. Vous pouvez trouver des informations à ce sujet dans le livre "Advanced UNIX Programming, 2nd Edn" de Rochkind, et sans doute d'autres livres similaires (le livre "Stevens Advanced Programming in the UNIX Environment" est un candidat probable, mais je n'ai pas de copie pour le vérifier).

4
screen -D -m yourEvilProgram 

devrait fonctionner. Beaucoup de temps s'est écoulé sincère je l'ai utilisé, mais si vous avez besoin de lire une partie de sa sortie, il pourrait même être possible que vous pourriez utiliser des prises pour le lire.

[Ajouté: deux liens, Rackaid et Pixelbeat, et la page d'accueil à GNU]

3

La solution classique pour contrôler une application comme celle-ci est Expect, qui configure les pseudo-terminaux, enregistre et pilote l'application contrôlée à partir d'un script. Il est livré avec de nombreux exemples de scripts, vous pouvez donc probablement en adapter un pour l'adapter à vos besoins.

3

C'est ce que je l'ai fait 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