私のウェブサイトへのリンクを含む電子メールを、彼がそれを訪問することを本当に望んでいる誰かに送信するとします(指を交差させたスタイル):
http://www.example.com/?utm_source=email392
または
http://www.example.com/somefile.pdf?utm_source=email392
/var/log/Apache2/other_vhosts_access.log
?を定期的に調べることにより、このURLにアクセスしたときにLinuxにアクション(自動メールの送信など)をトリガーさせる方法
さまざまなソース/ウェブサイトで実行する必要があるため、PHPレベルでは実行できません(PHPを使用するものもあれば、使用しないものもあり、ダウンロードするファイルへのリンクにすぎないものもあります)。など。PHPを使用しているWebサイトの場合でも、すべてのindex.php
を変更してそこから実行する必要はありません。そのため、Apacheログ解析方法を使用します)
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
_ を使用して監視されます。これは、ログに書き込まれるときに行を出力します。ログファイルがlogrotateによって定期的に移動される場合は、_--follow=name
_および_--retry
_オプションを追加して、ファイルパスだけでなく監視します。ファイル記述子。
tailからの出力は、 grep
にパイプされ、URLに一致する関連行がフィルタリングされます。
あなたはこのように1つのライナーを取ることができます:
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を返した場合)にのみ行の残りの部分が実行されることを意味します。その場合、2番目のgrep
によって取得された一致する行はmail
にパイプされ、[email protected]
に送信されます。 -s
引数( "アクセス済み!")。
同じロジック(grep -q ... && ...
)を使用して、他のアクションを実行できます。 &&
の後に、好きなように実行できます。より複雑なもののためのシェルスクリプト。
これをログのローテーションよりも高い頻度で実行する場合は注意してください。 1時間ごとにチェックしますが、ログを毎日ローテーションします。grep
はログがローテーションするまで同じ行を何度も検索し続けるため、アクションが複数回トリガーされる可能性があります。
私が解決策を書いている間、最初の答えは私のものと似ていることがわかりました。この場合もcrontabを避けることをお勧めします。コードを投稿します。
#!/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
}
さらに、&
演算子を使用してバックラウンドで実行できます。
./checklog.sh /var/log/Apache2/other_vhosts_access.log "somefile.pdf?utm_source=email392" &
または、システムの起動時に「デーモン」として起動します
フィルタApache-badbots.conf(正規表現をURLに置き換えます)を使用して、アクションsendmail.confとしてfail2banを試してください
[mycustombot] enable = true filter = Apache-badbots ##your "custom" script action = sendmail[name=MyBadBot,[email protected]] logpath = /your/access/logs/*/path
将来の参考のために、私が最終的に使用しているものを投稿します(わかりました、1つのライナーが時々悪いことを知っていますが...):
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 } &
ノート:
(もちろん、クレジットはセバストとワックスに行きます。)
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を使用してログに記録するように構成されている場合に機能します