Как читать несколько файлов из одного каталога, используя File :: Tail? - PullRequest
0 голосов
/ 21 марта 2011

Я пишу программу для чтения файла правил и журналов из системы IDS. Я использую функцию File :: Tail внутри Perl Не могу понять, как его использовать. Вот некоторые из моих примеров ...

Пример 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";
   }

с этим примером я могу распечатать все правила на моем терминале ... Как изменить правила с помощью функции file :: tail и даже записать все правила в новый файл?

Я пробовал это:

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 не запускается. У кого-нибудь есть идеи, почему он не запускается?

Ответы [ 3 ]

4 голосов
/ 21 марта 2011

Я не работал с File :: Tail, но, основываясь на его документации CPAN и на поведении, которое вы видите, выглядит так, как только вы запускаете его, следя за первым файлом в вашем массиве, он остается там до тех пор, пока вы не перестанете его хвостить..

Посмотрите на использование select с File :: Tail из CPAN .

Похоже, вам в основном нужно использовать File :: Tail :: selectи передать ему массив объектов File :: Tail вместе с любой другой базовой логикой, которая вам нужна, конечно, такой как цикл, показанный в примере, и т. д.

0 голосов
/ 21 марта 2011

Я предполагаю, что вы имеете в виду File :: Tail? (Я не могу найти Fail :: Tail на CPAN).

В документации по File :: Tail написано:

прочитать

read возвращает одну строку из ввода файл. Если нет готовых строк, это блоков пока нет.

Так что ваш цикл никогда не будет надежно завершен. Я никогда не смотрел на File :: Tail прежде, но я думаю вам нужно принять к сведению, где он говорит

NOWAIT

Не блокирует чтение, но возвращает пустую строку, если есть нечего читать. НЕ ИСПОЛЬЗУЙТЕ ЭТО если вы не знаете, что делаете. Если вы используете это в цикле, вы наверное не знаю кто ты делает. Если вы хотите прочитать хвосты из несколько файлов, используйте select.

0 голосов
/ 21 марта 2011

Запись в файл:

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 кажется ненужным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...