Filtrando a entrada do teclado

4

Eu tenho um programa que recebe informações do teclado e apresenta uma boa visualização. O objetivo do programa é que meu bebê possa esmagar o teclado e fazer com que o computador faça alguma coisa.

No entanto, eu gostaria de escrever um desinfetante de entrada de teclado que seja separado do programa principal. Conceitualmente, eu gostaria que o programa tivesse a funcionalidade:

  sanitize_keyboard_input | my_program

Onde my_program acha que está obtendo entrada do teclado, mas está realmente obtendo entrada de sanitize_keyboard_input . Existe uma maneira de fazer isso? Eu estou executando o Ubuntu Linux, se isso ajuda.

    
por stevejb 04.11.2012 / 06:51

1 resposta

1

Eu escrevi isso há muito tempo. É um script que fica entre a entrada do usuário e um programa interativo e permite que a entrada seja interceptada. Eu usei para escapar para o shell para verificar nomes de arquivos ao executar programas antigos do Fortran que faziam muitas perguntas. Você pode modificá-lo facilmente para interceptar entradas específicas e higienizá-las.

#!/usr/bin/perl

# shwrap.pl - Wrap any process for convenient escape to the shell.

use strict;
use warnings;

# Provide the executable to wrap as an argument
my $executable = shift;

my @escape_chars = ('#');             # Escape to shell with these chars
my $exit = 'bye';                     # Exit string for quick termination

open my $exe_fh, "|$executable @ARGV" or die "Cannot pipe to program $executable: $!";

# Set magic buffer autoflush on...
select((select($exe_fh), $| = 1)[0]);

# Accept input until the child process terminates or is terminated...
while ( 1 ) {
   chomp(my $input = <STDIN>);

   # End if we receive the special exit string...
   if ( $input =~ m/$exit/ ) {
      close $exe_fh;
      print "$0: Terminated child process...\n";
      exit;
   }

   foreach my $char ( @escape_chars ) {
      # Escape to the shell if the input starts with an escape character...
      if ( my ($command) = $input =~ m/^$char(.*)/ ) {
         system $command;
      }
      # Otherwise pass the input on to the executable...
      else {
         print $exe_fh "$input\n";
      }
   }
}

Um programa de teste de exemplo simples que você pode experimentar:

#!/usr/bin/perl

while (<>) {
   print "Got: $_";
}
    
por 04.11.2012 / 10:49