2011-03-21 53 views
0

我正在编写一个程序,从IDS系统读取规则和日志文件。 我在Perl中使用File :: Tail函数 无法弄清楚如何使用它。 下面是我的一些例子...如何使用File :: Tail从同一目录中读取多个文件?

例1

#!/usr/local/bin/perl 
use Fail::tail; 

opendir RUL, "/etc/snort/rules" || die "Could not open RUL directory\n $!"; 

my @allrule = grep {/.rules$/} readdir RUL; 
close RUL; 

    foreach my $rulefile (@allrule) 
    { 
     open(LF, "/etc/snort/rules/$rulefile") or die "$!"; 
     while(<LF>) 

     print "$\n"; 
    } 

这个例子我能打印我的终端上的所有规则... 如何更改使用文件中的规则::尾巴功能,甚至将所有规则写入一个新文件?

我尝试这样做:

Example 2 
#!/user/local/bin/perl 
. 
. 
. 
foreach my $rulefile(@allfule) 
{ 
    $file = File::Tail->new("/etc/snort/rules/$rulefile"); 
    while (defined(my $line = $file -> read)) 
    { 
     print $line; 
    } 
} 

实施例2将不会运行。 任何人有任何想法,为什么它不运行?

+0

我假设你真的是'文件:: Tail',而不是'失败:: tail'。 – toolic 2011-03-21 16:39:02

+0

你是什么意思的“不会运行”?究竟它是如何失败?你是否收到错误信息? – outis 2011-03-21 18:07:04

+0

得到什么......像程序正在运行,但第n打印出来,并没有退出... – terrance 2011-03-21 18:56:01

回答

4

我还没有使用过File :: Tail,但是基于它的CPAN文档和你看到的行为,看起来像是一旦你开始拖拽你的数组中的第一个文件,它会一直等到你停止拖尾文件。

看看usage of select with File::Tail from CPAN

它看起来像你基本上需要使用File :: Tail :: select并将一个File :: Tail对象的数组连同其他所需的基本逻辑一起传递给它,当然,比如循环中显示的循环例如,等

+0

这是一个很好的观点。可能比我的回答更好 – Cfreak 2011-03-21 16:45:52

0

其写入文件:

open(my $outfile, ">/path/to/someoutfile") or die $!; # use >> if you want to append instead of overwrite 
foreach my $rulefile(@allfule) 
{ 
    $file = File::Tail->new("/etc/snort/rules/$rulefile"); 
    while (defined(my $line = $file->read)) 
    { 
     print $outfile $line; 
    } 
} 
close($outfile); 

希望可以帮助您立即解决问题。我有一种感觉,有一种更好的方式来做到这一点,但我不确定你想要完成什么。对于日志Fail::Tail是有道理的,但(我假设)规则文件是静态的,所以Fail::Tail似乎没有必要。

+0

空格轮运算符没有任何问题! – 2011-03-21 16:49:09

+0

@Colin - 你说得对。固定 – Cfreak 2011-03-21 17:37:43

+0

感谢您的评论...我使用Fail :: tail作为规则文件,因为规则文件会在某个时候更新..其他更好的想法更新规则文件?...我的想法就像那样1st会将所有规则文件复制到同一个文件中。我的程序将读取日志文件,并且与规则文件匹配的那些数据包将提醒管理员或用户。所以程序只访问一个文件来匹配更快访问所有文件夹的数据包......一旦有规则文件的更新将自动更新组合规则文件... – terrance 2011-03-21 18:52:49

0

我猜你的意思是File :: Tail? (我无法在CPAN上找到Fail :: Tail)。

文档在File::Tail说:

阅读

读返回从输入 文件一行。如果没有准备好的线路,它会阻止直到有线路。

所以你的循环永远不会可靠完成。我从来没有在文件::尾看着面前,但我认为需要注意的地方说,

NOWAIT

上读不会阻止,但返回一个空字符串,如果有 没有什么可读的。除非你知道你在做什么,否则不要使用这个 。如果 你正在使用它在一个循环中,你可能不知道你在做什么 。如果要从 多个文件中读取尾部,请使用select。

+0

对不起,我面临一个问题...我使用的是Fedora 14 ..并且在完成配置snort并运行后,似乎日志文件的最大大小为128 MB。有两个问题:1)File :: Tail函数如何知道哪个文件应该是最新的文件? 2)可以将File :: Tail切换到新文件,而旧文件已满? – terrance 2011-03-24 18:52:01

相关问题