Acione uma ação quando uma URL for visitada

1

Digamos que eu envie um e-mail contendo um link para o meu site para alguém que eu realmente espero que ele o visite (estilo finger-crossed):

http://www.example.com/?utm_source=email392

ou

http://www.example.com/somefile.pdf?utm_source=email392

Como fazer com que o Linux acione uma ação (como enviar um e-mail automático para mim mesmo) quando este URL é visitado, examinando regularmente /var/log/apache2/other_vhosts_access.log ?

Eu não posso fazer isso em PHP porque eu preciso fazer isso para várias fontes / sites (alguns deles usam PHP, outros não e são apenas links para arquivos para serem baixados, etc .; mesmo para o sites usando PHP, eu não quero modificar todos os index.php para fazê-lo a partir daí, é por isso que eu prefiro um método de análise de log do Apache)

    
por Basj 12.09.2017 / 16:12

6 respostas

5

Monitoramento de logs ativos usando a substituição do processo bash:

#!/bin/bash

while IFS='$\n' read -r line;
do
    # action here, log line in $line

done < <(tail -n 0 -f /var/log/apache2/other_vhosts_access.log | \
         grep '/somefile.pdf?utm_source=email392')

Processo de substituição alimenta o ciclo de leitura com o saída do pipeline dentro de <(...) . A linha de log em si é atribuída à variável $line .

Os registros são assistidos usando tail -f , que exibe as linhas à medida que são gravadas nos registros. Se seus arquivos de log forem movidos periodicamente por logrotate , adicione as opções --follow=name e --retry para observar o caminho do arquivo em vez de apenas o descritor do arquivo.

A saída de tail é canalizada para grep , que filtra as informações relevantes linhas que correspondem aos seus URLs.

    
por 14.09.2017 / 17:12
1

Você pode pegar um liner como este:

grep -q "utm_source=email392" /var/log/apache2/other_vhosts_access.log && grep -q "utm_source=email392" /var/log/apache2/other_vhosts_access.log | mail -S "Accessed!" [email protected]

e executá-lo periodicamente via cron .

Explicando mais detalhadamente: o primeiro grep é usado apenas para verificar se é necessária uma ação adicional (adicionar -q faz com que fique quieto, ocultando quaisquer correspondências que possa encontrar). && significa que o restante da linha só será executado se o primeiro grep encontrar uma correspondência (isto é, retornar 0). Se esse for o caso, as linhas correspondentes obtidas pelo segundo grep serão canalizadas para mail a ser enviado para [email protected] , em um email com o assunto especificado pelo argumento -s (" Acessado! ").

A mesma lógica ( grep -q ... && ... ) pode ser usada para executar qualquer outra ação. Você pode executar o que quiser depois de && , por exemplo um script de shell para coisas mais complexas.

Observe que, se você executar isso com uma frequência maior que a do log, por exemplo, verificando a cada hora, mas rotacionando os logs diariamente - a ação pode ser acionada várias vezes, pois grep continuará encontrando as mesmas linhas repetidas vezes até que o log seja rotacionado.

    
por 14.09.2017 / 17:07
1

Enquanto escrevia minha solução, descobri que a primeira resposta é semelhante à minha. Eu recomendaria evitar crontab também neste caso. Vou postar meu código e espero que talvez possa ajudar.

#!/bin/bash
file="$1"
pattern="$2"

tail -f -n0 $file | {
   while IFS= read -r line
   do
      if [ ! -z $(echo $line | grep "$pattern") ] ; then
         echo "visited $pattern" | mail [email protected]
      fi
   done
}

Além disso, você pode executá-lo no backround com o operador & :

./checklog.sh /var/log/apache2/other_vhosts_access.log "somefile.pdf?utm_source=email392" &

ou inicie-o como um 'daemon' quando o sistema for inicializado

    
por 14.09.2017 / 17:52
1

Tente o fail2ban com o filtro apache-badbots.conf, (substitua o regex pelo seu url) e como ação sendmail.conf

[mycustombot] enable = true filter = apache-badbots ##your "custom" script action = sendmail[name=MyBadBot,[email protected]] logpath = /your/access/logs/*/path

    
por 14.09.2017 / 21:24
0

você pode fazer isso usando o rsyslog e o módulo ommail

link

algo como:

module(load="ommail")

if $msg contains "/somefile.pdf?utm_source=email392" then {
   action(type="ommail" server="..." port=".."
       mailfrom="...."
       mailto="..."
       subject.text="Page Viewed!")
}

isso funcionará se o apache estiver configurado para registrar usando o syslog

    
por 15.09.2017 / 15:12
0

Postando o que eu estou finalmente usando, para referência futura (ok, eu sei que alguns forros são às vezes ruins, mas ...):

tail -F -n0 /var/log/apache2/other_vhosts_access.log | grep --line-buffered "?src=_" | { while IFS= read -r line; do echo "$line" | mail [email protected]; done } &

Notas:

  • Eu tenho que usar grep --line-buffered por causa de este .

  • tail -F parece substituir --follow=name --retry , conforme mencionado aqui .

(Claro que o crédito vai para sebasth e Wax.)

    
por 15.09.2017 / 15:00