У меня проблемы с созданием пакетного кода для поиска IP в журнале с использованием текстового фильтра. Например: эта строка с веб-сервера Apache error.log:

[Fri Dec 13 23:32:47.531250 2013] [access_compat:error] [pid 3492:tid 464] [client 68.37.42.231:36925] AH01797: client denied by server configuration: /htdocs/cgi-bin/php

Найти ip используя текстовый фильтр: /htdocs /cgi-bin /php Вывод: 68.37.42.231

Является ли это возможным?

4 ответа4

1

Версия Powershell для извлечения всех IP-адресов, где предопределенный текстовый фильтр соответствует одной строке:

$input = "D:\input.log" 
$output = "D:\ouput.txt"    
$IPregex = "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])"
$filter = "/htdocs/cgi-bin/php"

gc $input | where { $_ -match $filter} | Select-String -Pattern $IPregex | % { $_.Matches } | % { $_.Value } > $output
1
bockra$ cat /tmp/su 
[Fri Dec 13 23:32:47.531250 2013] [access_compat:error][pid 3492:tid 464] [client 68.37.42.231:36925] AH01797: client denied by server configuration: /htdocs/cgi-bin/php

bockra$ awk -F'[: ]' {'print $15'} /tmp/su
68.37.42.231

awk может понимать несколько разделителей (-F '[:]') и «print $ 15» означает, что вы выводите строку # 15, используя: и пробел в качестве разделителей

Вы должны использовать AWK, чтобы сделать это быстрее :). Для linux или OsX он обычно предустановлен в dist. Для Windows вы можете скачать его здесь: http://gnuwin32.sourceforge.net/packages/gawk.htm

0

Вы можете использовать grep для Windows:

@ECHO OFF &SETLOCAL
echo([Fri Dec 13 23:32:47.531250 2013] [access_compat:error] [pid 3492:tid 464] [client 68.37.42.231:36925] AH01797: client denied by server configuration: /htdocs/cgi-bin/php|grep -Eo "(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])"

68.37.42.231
0

Пожалуйста, извините, я решил сделать на другом языке, где я чувствую себя наиболее комфортно. Большое спасибо за ваши примеры, показанные здесь.

Язык программирования:http://en.wikipedia.org/wiki/Liberty_BASIC

nomainwin


[loop]

    'Sleep 500ms
    CALLDLL #kernel32 , "Sleep" , 500 AS Long , rc AS Void

    'Call sub and read last line
    gosub [log]

    'Find by filter in string, if exist abuse call sub
    if instr(lastline$,"xampp/cgi-bin/php") then gosub [htaccess]

    'If ip not exists in htaccess
    gosub [save]

    goto [loop]

    end




'SUBS


[htaccess]
    'Read .htaccess
    open "C:\xampp\htdocs\.htaccess" for input as #handle1
    while EOF(#handle1)=0
        line input #handle1, htaccess$

        if instr(htaccess$,delim2$) then
            exists=1
        else
            exists=0
        end if

    wend
    close #handle1

    RETURN


[log]
    'Sets the maximum size of an array
    dim array2$(999999)

    'Read errorlog file line by line
    open "C:\xampp\apache\logs\error.log" for input as #handle2
    while EOF(#handle2)=0
        input #handle2, array2$(errorlog)
        errorlog=errorlog+1
    wend
    close #handle2

    'Put last line in string
    lastline$ = array2$(errorlog-1)

    'Remove text to the string and get ip
    delim$ = word$(lastline$, 4, "]")
    delim1$ = word$(delim$, 1, ":")
    delim2$ = trim$(mid$(delim1$, 10, 50))

    RETURN


[save]
    'Save new entries in .htaccess
    if exists = 0 then

        'Create string and put parameter in front of the ip
        ip$ = "deny from " ; delim2$

        'Read .htaccesst file and put content in string
        open "C:\xampp\htdocs\.htaccess" for input as #f
         htaccesst$ = input$(#f, lof(#f))
        close #f

        'Clean .htaccesst file and put content within the file
        open "C:\xampp\htdocs\.htaccess" for output as #f
         print #f, htaccesst$
         print #f, ip$;
        close #f

    end if

    RETURN

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .