Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何扫描多个日志文件以查找其中哪些文件具有特定的IP地址?_Perl_Search_File_Grep - Fatal编程技术网

Perl 如何扫描多个日志文件以查找其中哪些文件具有特定的IP地址?

Perl 如何扫描多个日志文件以查找其中哪些文件具有特定的IP地址?,perl,search,file,grep,Perl,Search,File,Grep,最近有一些攻击者在我的服务器上尝试恶意的东西,所以我决定稍微“跟踪”他们,尽管我知道他们不会走得很远 现在,我有一个包含服务器日志的完整目录,我需要一种方法来搜索目录中的每个文件,如果找到字符串,则返回一个文件名。所以我想,有什么语言比Perl更适合用于文本和文件操作呢?因此,我的朋友正在帮助我使用一个脚本来扫描特定IP的所有文件,并返回包含该IP的文件名,这样我就不必手动通过每个日志来搜索攻击者。(我有几百个) #/usr/bin/perl $dir=“.”; opendir(DIR,“$DI

最近有一些攻击者在我的服务器上尝试恶意的东西,所以我决定稍微“跟踪”他们,尽管我知道他们不会走得很远

现在,我有一个包含服务器日志的完整目录,我需要一种方法来搜索目录中的每个文件,如果找到字符串,则返回一个文件名。所以我想,有什么语言比Perl更适合用于文本和文件操作呢?因此,我的朋友正在帮助我使用一个脚本来扫描特定IP的所有文件,并返回包含该IP的文件名,这样我就不必手动通过每个日志来搜索攻击者。(我有几百个)

#/usr/bin/perl
$dir=“.”;
opendir(DIR,“$DIR”);
@files=grep(/\.*$/,readdir(DIR));
closedir(DIR);
foreach$file(@files){
打开文件,“$FILE”或“无法打开文件”;
while(){
打印if/12.211.23.200/;
}
}
虽然它给了我目录读取错误。非常感谢您的帮助

编辑:代码已编辑,仍然表示权限被拒绝无法打开第10行的目录。如果您对目录更改为“”有疑问,我将从logs目录中运行脚本


Mike。

这将获得您在perl中查找的文件名,并且可能比运行和执行perl正则表达式快得多

@files = `find ~/ServerLogs -name "*.log" | xargs grep -l "<ip address>"`'
@files=`find~/ServerLogs-name“*.log”| xargs grep-l”“`

尽管如此,这将需要一个兼容*nix的系统,或Windows上的Cygwin。

这将获得您在perl中查找的文件名,并且可能比运行和执行perl正则表达式快得多

@files = `find ~/ServerLogs -name "*.log" | xargs grep -l "<ip address>"`'
@files=`find~/ServerLogs-name“*.log”| xargs grep-l”“`

不过,这需要一个兼容*nix的系统,或者Windows上的Cygwin。

首先获取源目录中的文件列表:

opendir(DIR, "$dir");
@files = grep(/\.log$/,readdir(DIR));
closedir(DIR);
然后循环浏览这些文件

foreach $file(@files)
{
  // file processing code
}

首先获取源目录中的文件列表:

opendir(DIR, "$dir");
@files = grep(/\.log$/,readdir(DIR));
closedir(DIR);
然后循环浏览这些文件

foreach $file(@files)
{
  // file processing code
}

您可以改用吗?

您可以改用吗?

当使用通过
readdir
找到的文件时,您必须将
$dirname
$filname
连接起来,请记住您尚未将
chdir
插入这些文件所在的目录

open FH, "<", "$dirname/$filname" or die "Cannot open $filname:$!";
无效,因为您正在搜索字符串末尾的零个或多个
字符。因为它是零或更多,所以它将匹配目录中的所有内容。如果您试图排除以
结尾的文件,请尝试以下操作:

@files = grep(!/\.$/,readdir(DIR));
注意
符号表示否定。否则(如果您只需要这些文件,而我误解了您的意图),请留下
输出

在任何情况下,如果您在第10行收到您的
die
消息,很可能您正在访问一个具有权限的文件,因此您无法读取它。尝试将文件名放在模具输出中,以便可以看到哪个文件失败:

open FILE, "$file" or die "Unable to open file: $file";

但与其他答案一样,我要重申:为什么不使用grep?unix命令,而不是Perl函数。

在使用通过
readdir
找到的文件时,必须将
$dirname
$filname
连接起来,请记住,您尚未将chdir
chdir
”插入这些文件所在的目录

open FH, "<", "$dirname/$filname" or die "Cannot open $filname:$!";
无效,因为您正在搜索字符串末尾的零个或多个
字符。因为它是零或更多,所以它将匹配目录中的所有内容。如果您试图排除以
结尾的文件,请尝试以下操作:

@files = grep(!/\.$/,readdir(DIR));
注意
符号表示否定。否则(如果您只需要这些文件,而我误解了您的意图),请留下
输出

在任何情况下,如果您在第10行收到您的
die
消息,很可能您正在访问一个具有权限的文件,因此您无法读取它。尝试将文件名放在模具输出中,以便可以看到哪个文件失败:

open FILE, "$file" or die "Unable to open file: $file";

但与其他答案一样,我要重申:为什么不使用grep?unix命令,而不是Perl函数。

我的第一个建议是使用grep。他们说这是工作的正确工具

但要回答你的问题:

readdir只返回目录中的文件名。您需要将目录名和文件名连接在一起

$path = "$dirname/$filname";
open FH, $path or die ...
然后您应该忽略实际上是目录的文件,例如“.”和“.”。获取$path后,检查它是否为文件

if (-f $path) {
    open FH, $path or die ...
    while (<FH>)
if(-f$path){
打开FH,$path或die。。。
而()

我的第一个建议是改用grep。他们说,这是适合这份工作的工具

但要回答你的问题:

readdir只返回目录中的文件名。您需要将目录名和文件名连接在一起

$path = "$dirname/$filname";
open FH, $path or die ...
然后您应该忽略实际上是目录的文件,例如“.”和“.”。获取$path后,检查它是否是文件

if (-f $path) {
    open FH, $path or die ...
    while (<FH>)
if(-f$path){
打开FH,$path或die。。。
而()

~不会在Perl中自动展开

opendir my $fh,  '~/' or die("Doin It Wrong");  # Doing It Wrong. 

opendir my $fh, glob('~/') and die( "Thats right!" );

~在Perl中不会自动展开

opendir my $fh,  '~/' or die("Doin It Wrong");  # Doing It Wrong. 

opendir my $fh, glob('~/') and die( "Thats right!" );
此外,如果必须使用
readdir()
,请确保保护表达式:

while (defined(my $filename = readdir(DH))) {
    ...
}
如果不执行
defined()
测试,如果找到名为“0”的文件,循环将终止。

此外,如果必须使用
readdir()
,请确保保护表达式:

while (defined(my $filename = readdir(DH))) {
    ...
}
如果不执行
defined()
测试,则如果找到名为“0”的文件,循环将终止。

是否查找日志解析器?我使用“日志解析”进行搜索,结果命中率超过200次。一些(可能很多)不相关-有些可能相关。这部分取决于您使用的web服务器。

您有没有查找日志解析器?我用“日志解析”搜索了一下,结果发现 grep -l 12\.211\.23\.200 *
use Path::Class; # always useful.
use File::Next;

my $files = File::Next::files( dir(qw/path to files/) ); # look in path/to/files
while( defined ( my $file = $files->() ) ){
    $file = file( $file );
    say "Examining $file";
    say "found foo" if $file->slurp =~ /foo/;
}