Php 获取字符串中的IP地址

Php 获取字符串中的IP地址,php,regex,search,Php,Regex,Search,我正在寻找某种PHP代码来扫描我的/var/log/secure,以过滤入侵尝试。下面是一些只需要搜索并获取IP地址的字符串示例。我使用0.0.0.0作为IP地址的示例,而不是实际的IP地址 来自0.0.0.0端口3108的无效用户管理员密码失败 0.0.0.0中的无效用户ubnt pam_unix(sshd:auth):身份验证失败;logname=uid=0 euid=0 tty=ssh-ruser=rhost=0.0.0 首先,欢迎来到StackOverflow 您需要的是preg\u m

我正在寻找某种PHP代码来扫描我的
/var/log/secure
,以过滤入侵尝试。下面是一些只需要搜索并获取IP地址的字符串示例。我使用
0.0.0.0
作为IP地址的示例,而不是实际的IP地址

来自0.0.0.0端口3108的无效用户管理员密码失败
0.0.0.0中的无效用户ubnt
pam_unix(sshd:auth):身份验证失败;logname=uid=0 euid=0 tty=ssh-ruser=rhost=0.0.0

首先,欢迎来到StackOverflow

您需要的是
preg\u match\u all
与正确的正则表达式组合

$subject=file_get_contents("/var/log/secure");
$pattern="/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
  (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
  (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
  (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/";
preg_match_all($pattern,$subject,$matches);
在此之后,
$matches
将包含文档中所有IP的列表。

顺便说一句,在你的问题中包括你迄今为止尝试过的代码。

这是我用来解析日志的PHP脚本

$file=fopen("/var/log/secure", "r");
$ipDateArray=array();
$i=0;
while($line=fgets($file)){
    $dateString='';
    $ip='';
    if(preg_match("/failed/i",$line)){
        $lineArr=preg_split('/\s+/', $line);
        if(count($lineArr)==15){
            $dateString=$lineArr[0]." ".$lineArr[1]." ".$lineArr[2];
            $ip=$lineArr[10];
            $ipDateArray[$ip]=$dateString;
        } 

    }
    unset($ip);
    $i++;
}
当然,您必须稍微修改一下结构。我的想法是使用
preg_match
逐行解析关键字
failed
,并将字符串拆分(类似于分解函数)为数组条目

由于日志文件的条目模式几乎相同,因此只需访问阵列的相同索引即可获得IP。在我的例子中,
$lineArr[10]
为失败的尝试保存日志文件中每个条目的IP地址


希望这能帮助您了解如何解析日志

根据OP in提供的附加信息,我决定重做我的答案。所以,

$file=file_get_contents("/var/log/secure");
$lines=explode("\n",$file);
$accepted=array();
$fail=array();
$r="/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/";
foreach($lines as $line){
  //try to get the ip
  $t=array();
  preg_match($r,$line,$t);
  $ip=$t[0];
  if(strpos($line,"Accepted password")!==FALSE){
    //Successfull login
    $accepted[]=$ip;
  }
  else{
    //failed login attempt
    $fail[]=$ip;
  }
}
现在,
$accepted
包含所有成功登录的IP,以及
$fail
所有未成功登录的IP


我希望这对您有所帮助。

您可以尝试使用fopen()函数$handle=fopen(“c:\\folder\\resource.txt”,“r”);您想简单地存储在该文件中找到的任何IP地址吗?包括您用来尝试解决该问题的代码。也要使用正确的格式。这将帮助其他人帮助您。$log=file_获取内容('/var/log/secure')。。。但是您可能需要使用提升的权限来执行脚本。这有点帮助。在我的示例中,您可以看到3行不同的代码,在/var/log/secure文件中还有许多其他错误消息,但我只需要提取IP地址,我不关心代码的其余部分。有些线路没有IP地址,所以我只想跳过它们,跳过任何包含“已接受的(用户名)密码”的线路。我玩了一下这个,使它工作起来,似乎有我需要的,除了它只从“失败”线路中提取IP。我需要所有的IP地址,除了包含“接受的密码(用户名)”的行。这真的很接近我需要的。谢谢你的帮助,奇怪。。。。此代码在我的Centos 6上运行良好,但在Centos 5上不起作用。我得到的不是IP,而是“连接”。我在文件中搜索了我得到的连接:Apr 19 08:31:26 MyMachine sshd[6213]:连接以0.0.0.0关闭在文件中我有一行也使用了“failed”和connection,但在两个系统上都是一样的。想不出来。。。致命:从套接字读取失败:对等方重置连接[preauth]是的,听起来好像有不同的线路您试图从中提取IP地址。我建议修复preg_匹配,并在拆分后对数组进行var_转储,以查看IP地址所在的索引以及是否需要清理字符串。哇。。。我对PHP真的很生疏。。。我想我是个恐龙。我还是个老派,只知道如何从$matches[0]中获取IP地址。我还需要跳过任何没有IP的行和任何包含“接受的(用户名)密码”的行。谢谢…@InTitusville,此代码段将使用文件中的所有IP地址填充
$matches
。它对不包含IP的行没有任何作用。因此,它将忽略像
SZenC的Accepted password
这样的行,因为它不包含IP。它也不关心给定行上的其他信息。我知道这对你有什么帮助。你说的听起来像是我需要的,但由于在PHP方面太落后,我需要知道的是如何从$matches中获取IP数据。是否有办法逐行读取IP,是否有办法检查安全文件中的每一行是否有“已接受密码”,并将这些IP记录在不同的maches阵列中?感谢您的帮助…再次感谢您的帮助,但有一些代码问题。文件内容缺少“s”,第12行将“==”更改为“==”,第10行和第11行出现错误:PHP注意:未定义变量:第10行test_ip.PHP中的t PHP注意:第11行test_ip.PHP中的未定义变量:t,我认为我们正在接近。。。我真的很感谢你在这方面的帮助。给你。
==
是故意的,这是因为
0
的计算结果为
FALSE
当它应该为
TRUE
时,我将“==”放回原处,但仍然得到第10行和第11行错误,“未定义变量:t”。现在应该修复它了:PHP解析错误:“语法错误,在/home/spfx/test\u ip.PHP的第14行出现意外的'if'(t\if)”我猜是因为第13行的“;”不见了。我把“;”放在第13行,现在我得到了IPs,但也得到了这个错误:“PHP注意:第13行test_ip.PHP中未定义的偏移量:0”。