2010-10-06 110 views
1

好吧,你们中的一些人可能已经注意到我一直在解决这个问题,并持续了大约3周。我无法弄清楚我的生活发生了什么事情。下面是perl脚本,它保存来自USB读卡器的输入,就像键盘一样。该机器是一个嵌入式系统,使用voyage linux运行在小型闪存驱动器上。linux和perl脚本输入

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: [email protected]/0 
15679 pts/0 Ss  0:00 -bash 
15710 ?  Z  0:00 [watchdog] <defunct> 
15711 pts/0 R+  0:00 ps x 

所以,从那里,我不知道哪里去了。任何人都可以给我任何建议或提示,如何这个脚本实际上接收来自USB读卡器的输入。此外,它还有一些如何在未登录时接收输入。该机器是嵌入式机器,我打开它,并使用perl脚本接受滑动并保存它们。

回答

0

关键位是在这里:

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

的USB读卡器设置指导其输入STDIN,因为它表现得像一个键盘。当它完成读卡时,它发送回车。 “输入”然后被Perl读取并卡入$text,然后等待下一次滑动。一旦完成三次滑动(三行<STDIN>行),它就会处理信息并将其写入文件。然后,由于您处于while(1)循环中,因此它只是循环回到循环的顶部并等待更多输入。

您可以通过运行该程序在另一台计算机上模拟此操作,然后在等待输入时键入一些文本并使用Enter键结束。做三次模拟三次滑动,程序应该处理它。

+0

是但程序没有在机器上运行?它也不会在前台运行。 – 2010-10-06 18:41:29

0

该脚本正在从stdin读取,因此您需要找到哪个/哪些人正在调用此脚本,并查看stdin上正在管理的内容。

您是否检查过系统的cron作业?您可以通过查看/DATA/SWIPES.TXT文件的时间戳和所有权来找到提示。