Perl脚本:File :: Tail函数如何读取二进制(TCPDUMP)文件?

时间:2011-03-25 22:53:46

标签: perl logging snort

任何人都可以就此代码给我一些意见吗?

#!/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.1301090101snort.log.1301090102snort.log.1301090102,则无法使用单个File::Tail函数读取所有内容或文件内的文件?目录

1 个答案:

答案 0 :(得分:1)

正如您在第一个问题中所解释的那样:您不能直接阅读这些文件。它们是二进制格式,而不是文本格式。您无法使用File::Tail

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

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

将它们拖尾的唯一方法是将snort配置更改为输出ASCII日志,但是您可能遇到问题,因为它能够跟上数据包流。