Encontre o IP no error.log

0

Estou tendo problemas para criar um código de lote para localizar o IP em um log usando um filtro de texto. Por exemplo: esta linha do servidor da web 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

Encontre o ip usando o filtro de texto: / htdocs / cgi-bin / php Produção: 68.37.42.231

É possível?

    
por Rui Branco 14.12.2013 / 01:02

4 respostas

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

o awk pode entender vários delímetros (-F '[:]') e 'print $ 15' significa que sua saída é string # 15 usando: e espaço como separadores

Você precisa usar o AWK para torná-lo mais rápido :) Para o linux ou o OsX, normalmente está pré-instalado. Para as janelas, você pode fazer o download aqui: link

    
por 14.12.2013 / 10:36
1

Uma versão do Powershell para extrair todos os endereços IP nos quais um filtro de texto predefinido corresponde à mesma linha é:

$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
    
por 14.12.2013 / 21:16
0

você pode usar o grep para 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
    
por 14.12.2013 / 16:57
0

Por favor, desculpe-me, eu decidi fazer em outro idioma onde me sinto mais confortável. Muito obrigado pelos exemplos mostrados aqui.

A linguagem de programação: link

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
    
por 15.12.2013 / 00:40