-2

任何人都可以给我一些关于这段代码的意见吗?

#!/usr/local/bin/perl
use File::Tail;

$file = File::Tail -> new("/var/log/snort/snort.log.1301090101");
while(defined($line=$file ->read))
{
   print $line;
} 

由于日志文件是二进制格式,所以我尝试像这样修改代码

#!/usr/local/bin/perl
use File::Tail;

$file = File::Tail -> new("/var/log/snort/snort.log.1301090101");
open(my $LF, "-|", "/usr/local/bin/snort -r $file") or die "$!";
while(defined($line=$file ->read))
{
   print $line;
} 

这段代码似乎有一些语法错误..不可能结合管道和文件尾功能?函数不是file::tail已经包含open()方法了吗?

第二个问题是关于$file = File::Tail -> new(<Filename>); <Filename>似乎必须是单个文件并且必须指向特定文件名...如果我有 3 个文件:snort.log.1301090101并且snort.log.1301090102snort.log.1301090102同一目录中,则无法使用单个File::Tail函数来读取所有文件或其中的文件目录?

4

1 回答 1

1

正如您在第一个问题中所解释的:您不能简单地直接读取这些文件。它们是二进制格式,而不是文本。你不能使用File::Tail.

您可以将读取这些日志的实际 snort 进程的输出通过管道传输到 perl,如图所示。如果它不提供“尾”类型选项,则不能尾随它们。

有一个旧的 perl 模块Net::TcpDumpLog可以让你直接读取数据,如果它仍然有效,但它也不能跟踪日志。

跟踪它们的唯一方法是更改​​您的 snort 配置以输出 ASCII 日志,但您可能会遇到它能够跟上数据包流的问题。

于 2011-03-26T01:24:20.753 回答