WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

何度も調べてるので備忘録でメモします。

■特定のURLに来たアクセスをIPアドレスごとにグルーピングしてカウントする


zcat access_log.23.gz | grep -E 'GET [^"]+/path/to' | cut -d ' ' -f 1 | sort | uniq -c | sort -n


zcatは圧縮したままcat、grepのEオプションは拡張正規表現、cutは半角スペース(dオプション)で区切って1つ目(fオプション)のみを抜き出す。sortで並び替えた後、uniqで同じ物をまとめカウント付き(cオプション)で表示、改めてsortで数の昇順で並び替えてます。

■特定のURLのアクセスログを特定のデータのみ表示

zcat access_log.23.gz | grep -E 'GET [^"]+/path/to' | cut -d ' ' -f 4,5,1,6,7,8,11


cutコマンドはdオプションで区切り文字(デリミタ)を指定し、fオプションでn番目を指定して、特定の文字のみを抜き出すコマンドです。

■おまけ - 複数のログにまたがって検索

zcat access_log.23.gz access_log.22.gz access_log.21.gz


zcat(cat)はスペース区切りで複数のファイルを一気に出力可能です。


    このエントリーをはてなブックマークに追加

スクリプトはなんでもいいのですが、試していたのがjmeterなのでそのままサンプルを出します。


/bin/sh /home/admin/apache-jmeter-2.10/bin/jmeter -n -Jlogname="/tmp/jmeter.log" -Jdomain="www.example.com" -t /home/admin/jmeter/sample.jmx
このコマンドは問題なく動くとします。でこれを動的に実行します。jmeter.shを下記のように書いてこれを実行

#!/bin/sh
cmd="/bin/sh /home/admin/apache-jmeter-2.10/bin/jmeter -n -Jlogname=\"/tmp/jmeter.log\" -Jdomain=\"www.example.com\" -t /home/admin/jmeter/sample.jmx"
$cmd

./jmeter.sh

Created the tree successfully using /home/admin/jmeter/sample.jmx
Starting the test @ Tue Dec 17 14:08:26 JST 2013 (1387256906227)
Waiting for possible shutdown message on port 4445
Tidying up ... @ Tue Dec 17 14:08:26 JST 2013 (1387256906790)
... end of run
動いたようにみえるのですが実は引数がうまくわたっていません。実行先のスクリプト「/home/admin/apache-jmeter-2.10/bin/jmeter」では引数がクオート記号付きで解釈されそのまま処理されます。つまり上記の例だとjmeterに渡されるJdomainは「www.example.com」ではなく「"www.example.com"」が渡されて「http://"www.example.com"」にアクセスを試みようとしています。

クオート記号を引数に持つコマンドを動的に実行するには「eval」を使います。

#!/bin/sh
cmd="/bin/sh /home/admin/apache-jmeter-2.10/bin/jmeter -n -Jlogname=\"/tmp/jmeter.log\" -Jdomain=\"www.example.com\" -t /home/admin/jmeter/sample.jmx"
eval $cmd
当たり前ですが渡された物はそのまま実行されますので、不特定多数が値を渡せる場所に使う場合は注意して下さい。

    このエントリーをはてなブックマークに追加


cat /path/to/access.log | grep 'GET / HTTP/1.1' | cut -d ' ' -f 1 | sort | uniq -c

ApacheのログでIP毎のカウント見るコマンド。上の例ではサイトのインデックス"/"へのアクセスを見てます。リスティング攻撃を受けてIPを特定するのに使いました。

Yahoo用とgoogle用です。

cat /path/to/access.log | grep 'GET / HTTP/1.1' | grep 'www.google.co.jp' | cut -d ' ' -f 1 | sort | uniq -c
cat /path/to/access.log | grep 'GET / HTTP/1.1' | grep 'search.yahoo.co.jp' | cut -d ' ' -f 1 | sort | uniq -c


ちなみにGoogleは熱心に対応してくれて、さらにIPフィルターもあるので安心しました。でもYahooはフィルターもないし対応いまいちでした。フィルター無いってまじですか?その態度や機能が収益の差なんだろうなあと思いました。

    このエントリーをはてなブックマークに追加

同じ理由でハマったのが2度めで、尚且つ中々思い出せずハマったのでメモしておきます。

開発用サーバーに本番サーバーからデータベースのdumpを流し込んだらAccess denied for userで接続できませんでした。対象DBにGRANTすると正常にGRANT出来るのですがそれでも接続できません。

結論をいうと流し込んだ後にmysqlサーバーを再起動しないとダメみたいです。大丈夫な時もあったような気がするのでなにか条件が重なるとなるのかも。やった手順は下記のとおりです。


mysqldump -u root --add-drop-database --all-databases > /tmp/db.dump

丸っとDBをdumpしました。このファイルを開発用サーバーにコピーして

mysql -u root dbname < /path/to/db.dump

こんな感じで流し込みました。

    このエントリーをはてなブックマークに追加

ChefでgithubからSSHでcloneするのにハマりました。known_hostsの追加のところでyes/noの確認が出て、そこから先に進まなくなります。

色々方法はありそうですが、今回はbashを使いました。ハマったのは、冪等性?を守るためにあったら追加しない、という部分です。ユーザーはadminという名前のユーザーを想定したリソースです。


bash "known host for github" do
code "ssh-keyscan -H github.com >> /home/admin/.ssh/known_hosts"
user "admin"
not_if "su admin --c 'ssh-keygen -F github.com | grep -q \'github\.com\''"
end
ポイントは、bash自体がroot権限で行われるところですね。not_ifのスクリプトがrootの~/.ssh/known_hostsを見に行ってたみたいです。

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。