假设我向某人发送了一封电子邮件,其中包含指向我的网站的链接,我真的希望他会访问该电子邮件(手指交叉风格):
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 进行日志记录,这将起作用