2011-03-21 55 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

相關問題