代码片段 读取日志中的IP
in PHPLinux with 1 comment

代码片段 读取日志中的IP

in PHPLinux with 1 comment

代码片段

日志ip读取

最近服务器总是有一些乱七八糟的请求进来,域名解析到我服务器没修改的,检查服务器漏洞的爬虫,尝试访问爆破wordpress后台的,尝试访问已知的路由器漏洞页面的。如下:
get_log_ip_1

于是我新建了个 vhost 把所有直接请求 ip 地址的和一些恶意的请求全都定向到这个 vhost ,并统一返回状态码 666 (╯‵□′)╯︵┻━┻。然后写了个 php 脚本统计日志中记录的这些请求的 ip 地址。定时每天凌晨运行一次,然后抽时间就统一把这些 ip 加到黑名单里。
以下是源码。

代码

PHP脚本

<?php

/**
 * 将日志中的 IP 信息存储到文件中
 * @param   $log_file_path   string     要处理的的文件路径
 * @param   $save_file_path  string     要存储的目标文件路径
 * @param   $explode_str     string     拆分日志中字符串所需参数,默认为' - - '
 * @return  string           执行结果
 */ 
function get_log_ip ($log_file_path, $save_file_path, $explode_str = ' - - ') {
    // 将日志字符串拆分到数组中
    $n0 = fopen($log_file_path, 'r');
    $g = explode("\n", fread($n0, filesize($log_file_path)));
    fclose($n0);
    
    // 按指定规范将字符串截断(只保留IP)(前提是IP在行首)
    foreach($g as $k => $v) {
        $g[$k] = substr($v, 0, strpos($v, $explode_str));
    }
    
    // 数组去重
    $g = array_unique($g);
    
    // 文件操作// 读取文件中的IP
    $nr = fopen($save_file_path, 'r');
    $yuan_ip = explode("\n", fread($nr, filesize($save_file_path)));
    fclose($nr);
    
    // 写入文件末尾
    $n = fopen($save_file_path, 'a');
    foreach($g as $v) {
        // 如果原文件中存在此IP,则跳过
        if(in_array($v, $yuan_ip)){
            continue;   
        }else{
            fwrite($n, $v."\n");
        }
    }
    fclose($n);
    return 'success!';
}
echo get_log_ip($argv[1], $argv[2]);

服务器定时器脚本

#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
php 脚本路径 日志文件路径 存放的路径 
echo "----------------------------------------------------------------------------"
endDate=`date +"%Y-%m-%d %H:%M:%S"`
echo "[$endDate] 任务执行成功"
echo "----------------------------------------------------------------------------"

以下是最近一周的成果:已经采集了 500 多个不同的 ip 了。只要将这些 ip 添加到黑名单或防火墙即可。
get_log_ip_2

PS

Responses
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif
  1. name

    see understand!

    Reply