ввод Linux и Perl-скриптов - PullRequest
       9

ввод Linux и Perl-скриптов

1 голос
/ 06 октября 2010

Хорошо, некоторые из вас могли заметить, что я работаю над этой проблемой время от времени около 3 недель. Я не могу понять, что происходит со мной. Ниже приведен скрипт на Perl, который сохраняет данные с USB-карт-ридера, который работает как клавиатура. Машина представляет собой встроенную систему, работающую на компактной флешке с использованием Voyage Linux.

use strict;
use Time::Local;

open(MATCH,'swipe_match.txt');
my @matches = <MATCH>;
close(MATCH);

my $error = qr/[+%;]E\?/;

while(1) {
        my $text = <STDIN>;
        my $text1 = <STDIN>;
        my $text2 = <STDIN>;
        if (($text && $text1 && $text2) or ($text && $text1) or $text) {
                my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = localtime(); $year += 1900;
                $mon+=1;
                my $timestamp = "$mon/$mday/$year $hour:$min:$sec";
                chomp $text;
        chomp $text1;
        chomp $text2;

#               my $matched = 0;
#               foreach my $test (@matches) {
#                       chomp $test;
#                       $matched = 1 if ($text =~ /$test/i);
#               }
#               if ($matched) {
#                       system("aplay /SWIPE/good.wav >/dev/null 2>/dev/null");
#               } else {
#                       system("aplay /SWIPE/bad.wav >/dev/null 2>/dev/null");
#               }

        # write out the swipe even if its bad...
        open(LOG,'>>/DATA/SWIPES.TXT');
        print LOG $text."\t".$text1."\t".$text2."\t".$timestamp."\n";
        close(LOG);

        if ($text =~ $error or $text1 =~ $error or $text2 =~ $error) {
                        system("aplay /SWIPE/bad.wav >/dev/null 2>/dev/null");
        }
        else {
                        system("aplay /SWIPE/good.wav >/dev/null 2>/dev/null");
        }
        }
}
exit;

Я не писал этот сценарий, и человек, который его написал, давно ушел. На данный момент у меня 2 машины. Один из которых работает, а другой - тот, который я пытаюсь заставить работать. Я пытаюсь выяснить, как этот сценарий получает вход (на машине, которая работает). Я могу открыть файл журнала /DATA/SWIPES.TXT и просмотреть фактические пролистывания. В настоящее время на компьютере нет запущенных процессов, которые могли бы повлиять на сценарий, вот процессы:

  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:29 init [2]
    2 ?        S<     0:00 [kthreadd]
    3 ?        S<     0:04 [ksoftirqd/0]
    4 ?        S<     3:21 [events/0]
    5 ?        S<     0:00 [khelper]
   44 ?        S<     0:00 [kblockd/0]
   46 ?        S<     0:00 [kacpid]
   47 ?        S<     0:00 [kacpi_notify]
   94 ?        S<     0:00 [kseriod]
  134 ?        S      0:00 [pdflush]
  135 ?        S      0:06 [pdflush]
  136 ?        S<     0:00 [kswapd0]
  137 ?        S<     0:00 [aio/0]
  138 ?        S<     0:00 [nfsiod]
  795 ?        S<     0:00 [kpsmoused]
  800 ?        S<     0:00 [rpciod/0]
 1627 ?        S<     0:00 [ksuspend_usbd]
 1631 ?        S<     0:00 [khubd]
 1646 ?        S<     0:00 [ata/0]
 1648 ?        S<     0:00 [ata_aux]
 1794 ?        S<s    0:00 udevd --daemon
 2913 ?        Ss     0:00 pump -i eth0
 2979 ?        Ss     0:00 /usr/sbin/rpc.idmapd
 3060 ?        S      0:01 /usr/sbin/syslogd --no-forward
 3083 ?        Ss     0:00 /usr/sbin/sshd
 3099 ?        S      0:00 /usr/sbin/inetutils-inetd
 3122 ?        Ss     0:00 /usr/sbin/pptpd
 3138 ?        Ss     0:00 /usr/sbin/cron
 3149 ?        SLs    0:33 /usr/sbin/watchdog
 3167 tty2     Ss+    0:00 /sbin/mingetty tty2
 3169 tty3     Ss+    0:00 /sbin/rungetty tty3
 3170 tty4     Ss+    0:00 /sbin/rungetty tty4
 3173 tty5     Ss+    0:00 /sbin/getty 38400 tty5
 3175 tty6     Ss+    0:00 /sbin/getty 38400 tty6
15677 ?        Ss     0:00 sshd: root@pts/0
15679 pts/0    Ss     0:00 -bash
15710 ?        Z      0:00 [watchdog] <defunct>
15711 pts/0    R+     0:00 ps x

Итак, оттуда я не знаю, куда идти. Может ли кто-нибудь дать мне какие-либо предложения или советы о том, как этот скрипт на самом деле получает входные данные от USB-ридера. Кроме того, он каким-то образом получает входные данные, пока не вошел в систему. Машина является встроенной, я включаю ее, и она принимает свипы и сохраняет их, используя скрипт perl.

Ответы [ 3 ]

1 голос
/ 06 октября 2010

Взгляните на udev, кроме прочего: «Запустите скрипт, когда узел устройства создается или удаляется (обычно, когда устройство подключено или отключено)»

http://www.reactivated.net/writing_udev_rules.html

0 голосов
/ 06 октября 2010

Сценарий читает со стандартного ввода, поэтому вам нужно найти, где / кто вызывает этот сценарий, и посмотреть, что передается на стандартный ввод.

Вы проверили системные задания cron? Вы можете найти подсказку, посмотрев метку времени и владельца файла /DATA/SWIPES.TXT.

0 голосов
/ 06 октября 2010

Здесь находятся ключевые биты:

while(1) {
  my $text = <STDIN>;

Устройство чтения карт USB настроено для направления своего ввода на STDIN, поскольку оно действует как клавиатура.Когда он заканчивает чтение карты, он отправляет возврат каретки.Затем «ввод» читается Perl и вставляется в $text, затем он ждет следующего удара.Как только три пролистывания сделаны (три <STDIN> строки), он обрабатывает информацию и записывает ее в файл.Затем, так как вы находитесь в цикле while(1), он просто возвращается к началу цикла и ожидает большего ввода.

Вы можете смоделировать это на другом компьютере, запустив программу, затемон ждет ввода, вы набираете какой-то текст и заканчиваете его клавишей Enter.Сделайте это три раза, чтобы смоделировать три пролистывания, и программа должна обработать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...