当访问 URL 时触发操作

当访问 URL 时触发操作

假设我向某人发送了一封电子邮件,其中包含指向我的网站的链接,我真的希望他会访问该电子邮件(手指交叉风格):

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

或者

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

如何通过定期检查,让 Linux 在访问此 URL 时触发操作(例如向自己发送自动电子邮件)/var/log/apache2/other_vhosts_access.log

我无法在 PHP 级别执行此操作,因为我需要对各种源/网站执行此操作(其中一些使用 PHP,一些不使用 PHP,只是链接到要下载的文件等;即使对于使用 PHP 的网站,我不想修改每一个index.php来从那里开始,这就是为什么我更喜欢 Apache 日志解析方法)

答案1

使用 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')

工艺替代将内部管道的输出提供给读取循环<(...)。日志行本身被分配给变量$line

使用以下方式查看日志tail -f,它在写入日志时输出行。如果您的日志文件定期移动对数旋转、添加--follow=name--retry选项来监视文件路径而不仅仅是文件描述符。

输出来自尾巴被输送到grep,它会过滤与您的 URL 匹配的相关行。

答案2

您可以像这样使用单衬管:

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]

并通过定期运行它cron

更详细地解释一下:第一个grep仅用于检查是否需要进一步操作(添加-q使其安静,隐藏它可能找到的任何匹配项)。 &&意味着该行的其余部分仅在第一行grep找到匹配项(即返回 0)时才会运行。如果是这种情况,则第二个获得的匹配行将通过grep管道传输到mail发送至[email protected], 的电子邮件,其主题由参数-s("已访问!”)。

相同的逻辑 ( grep -q ... && ...) 可用于执行任何其他操作。之后您可以运行任何您想要的内容&&,例如用于更复杂的内容的 shell 脚本。

请注意,如果您以比日志轮换更高的频率运行此操作(例如每小时检查一次但每天轮换日志),则该操作可能会被触发多次,因为grep将不断地一遍又一遍地查找相同的行,直到日志旋转。

答案3

尝试使用过滤器 apache-badbots.conf 进行失败2ban(将正则表达式替换为您的网址)并作为操作 sendmail.conf

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

答案4

您可以使用 rsyslog 和 ommail 模块来做到这一点

http://www.rsyslog.com/doc/v8-stable/configuration/modules/ommail.html

就像是:

module(load="ommail")

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

如果 apache 配置为使用 syslog 进行日志记录,这将起作用

相关内容