アクセスログのIPアドレスを集計してみる

参考:Linux サーバーでお手軽にログの集計:こっそりと。 - livedoor Blog(ブログ)

Google Analyticsでリファラ無しの変なアクセスが増えたので、アクセスログからIPを集計してみた。 アクセスログの書式はLTSVでこんな感じ

time:07/Mar/2014:06:25:22 +0900       host::11.22.33.46       forwardedfor:-  req:GET / HTTP/1.1   status:200      size:1       referer:-ua:Mozilla/5.0 (***)      reqtime:0.777   cache:- runtime:-       vhost:hoge.fuga

なんか色々ソフト使うのとか面倒だったのでgrepとかawkでほげほげした。要はhost:11.22.33.44に当たる箇所を取り出して表示回数をまとめれば良い。

$ cat access.log | grep -v -i "bot" | grep "referer:-" | grep "status:200" | awk '{print $3}' | sort | uniq -c

軽くbot避けを入れてるけど、crawlerとかspiderとかを避けておくとより正確になるかも。 これだけだと一杯出てくるので100回以上アクセスあったIPだけ取り出してみた。

$ cat access.log | grep -v -i "bot" | grep "referer:-" | grep "status:200" | awk '{print $3}' | sort | uniq -c | grep "[0-9]\{3,\}\s"

ただ、最初の目的には最初の集計の方が役に立った。結局Bingのボットだったみたい。Analyticsではじけなかったアクセスがあったのかな。

大きなファイルを探す

例:100MB以上のファイルを探す

$ find path -size 100M

Windows共有フォルダをマウント

参考:Ubuntu から Windows の共有フォルダをマウントして利用する - Qiitaというかほぼそのまま

$ sudo aptitude install cifs-utils
$ sudo mkdir -p /mnt/windows
$ sudo mount -t cifs -o username=WindowsUsername,password=WindowsPassword //ServerNameOrIp/path/to/share /mnt/windows

ファイルのフルパス一覧を取得

参考:逆引きUNIXコマンド/ファイルのフルパス名を取得する方法 - Linuxと過ごす

単純なlsだとファイル名だけが一覧になるので、フルパスの一覧が欲しい場合は一工夫必要

$ ls -dF /path/to/dir/*
$ find `pwd` -maxdepth 1 -mindepth 1

SSHを使ってリモートでコマンド実行する

単純なコマンド実行

$ ssh [email protected] options... "command"

ローカルのファイルをリダイレクトしてリモートコマンドに使用する。

$ ssh [email protected] options... "command" < localfile

重複行を削除する

$ cat hoge | sort | uniq

参考:[Linux] sort と uniq をパイプでつないで重複行を削除する | CodeNote.net

文字列置換(sed)関連

一番最初にマッチしたものを置換

$ sed 1,/pattern/s/pattern/replace/

1は1行目からの意味。10行目から始めたければ10に変えるとか、数字はパターンにしても良い

$ sed /pattern from/,/pattern/s/pattern/replace/

一行目に文字列を追加する

$ sed -i hoge -e "1i fuga"

参考: sedにて一番最初にマッチしたモノだけを置換するには - 計算機と戯れる日々

ファイルを上書き保存

オプション -iを使う。一括でファイル上書きならこんな感じ

$ find . -name "*.html" | xargs sed -i -e s/hoge/fuga/

参考: sedでファイルを上書き保存

grepで該当行前後を表示する

$ cat hoge.txt | grep "fuga" -3 #前後3行
$ cat hoge.txt | grep "fuga" -B 3 #前3行
$ cat hoge.txt | grep "fuga" -A 3 #後3行

sshでポートフォワーディング

例えばPostgreSQLのポート5432をローカルの6542にポートフォワードする場合は

$ ssh -N -f -L 6543:localhost:5432 [email protected]

時刻調整

ntpをインストールする必要はない。Ubuntuの場合、ntpdate-debianコマンドがあればいける。ntpdateコマンドだとエラーが出た。

$ sudo ntpdate
no servers can be used, exiting
$ sudo ntpdate-debian
step time server xxx.xxx.xxx.xxx offset -914.392749 sec

参考:[SOLVED] ntpdate - No Servers

ntpサーバを指定するには/etc/default/ntpdateを変更する

NTP_USE_NTP_CONF=no
NTPSERVERS="ntp.nict.jp"

毎日のcronjobで動作させる

sudo cd /etc/cron.daily
sudo ln -s /etc/network/if-up.d/ntpdate ./ntpdate

でおk 参考:Ubuntu ntpdate 時刻合わせ - ガットポンポコ

windows共有フォルダをマウント

コマンドはこんな感じ

$ sudo aptitude install cifs-utils
$ sudo mount -t cifs -o username=Windowsユーザー名,password=Windowsパスワード,uid=Linuxユーザーid,gid=Linuxグループid //windows ip/path/to/share /mnt/path/to/share

こうしておくとファイルの編集も可能。uidとかgidが無いとrootで共有する。

linux(ubuntu)起動時に共有したい場合、fstabを編集する

//windows ip/path/to/share  /mnt/path/to/share  cifs  credentials=/home/username/.windowscredentials,uid=Linuxユーザーid,gid=Linuxグループid,iocharset=utf8  0  0

上のコマンドみたいにWindowsユーザー名、パスワードを入力してもいけるが、fstabは複数人から見ることが出来るので、ユーザーフォルダ内に認証用のファイルを作ってパスワードを隠す

/home/username/.windowscredentialsを次のようにして600で保存すればおk

username=Windowsユーザー名
password=Windowsパスワード

参考:MountWindowsSharesPermanently - Ubuntu Wiki

LANで利用されているIPアドレスを調べる

arp-scanコマンドを使う。 まずはインストール

$ sudo aptitude install arp-scan

使い方

$ sudo arp-scan -I eth0 -l

eth0はスキャンしたいネットワークアダプタ

csvからカラム切り出し

例としてhoge.csvの2カラム目を取り出す

$ cut -f 2 hoge.csv

この場合タブ区切り、カンマ区切りしたい場合は

$ cut -d , -f 2 hoge.csv

参考:逆引きUNIXコマンド/指定したフィールドを抜き出す - Linuxと過ごす

csvのソート

$ sort --field-separator=',' --key=2

こうやるとカンマ区切りのデータの2番目のカラムでソートしてくれる

数値でソートしたい場合は-nをオプションに加える

逆順の場合は--reverseをオプションに加える

参考:unix - Sort CSV file by column priority using the "sort" command - Stack Overflow

cronjobの一覧

$ crontab -l
$ sudo crontab -l -u username
$ ls /etc/cron.d
$ ls /etc/cron.hourly
$ ls /etc/cron.daily
$ ls /etc/cron.weekly
$ ls /etc/cron.monthly

これくらいチェックすればよさげ

iconvでエラーをスキップ

cオプションを付ければ良い

$ iconv -c -f SJIS -t UTF-8 hoge.txt