web-dev-qa-db-ja.com

URLにアクセスしたときにアクションをトリガーする

私のウェブサイトへのリンクを含む電子メールを、彼がそれを訪問することを本当に望んでいる誰かに送信するとします(指を交差させたスタイル):

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ログ解析方法を使用します)

1
Basj

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に一致する関連行がフィルタリングされます。

5
sebasth

あなたはこのように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はログがローテーションするまで同じ行を何度も検索し続けるため、アクションが複数回トリガーされる可能性があります。

1
Zé Loff

私が解決策を書いている間、最初の答えは私のものと似ていることがわかりました。この場合も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" &

または、システムの起動時に「デーモン」として起動します

1
Wax

フィルタ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
BrenoZan

将来の参考のために、私が最終的に使用しているものを投稿します(わかりました、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 } &

ノート:

  • this のため、grep --line-bufferedを使用する必要があります。

  • tail -Fは、前述のように--follow=name --retryを置き換えるようです ここ

(もちろん、クレジットはセバストとワックスに行きます。)

0
Basj

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を使用してログに記録するように構成されている場合に機能します

0
Diego Roccia