tcpdumpを使ってPOP3を監視
なんというか、変なコードを書いてしまった。普通のpop3サーバなら、この情報はsyslogにだしてくれるんだけどなぁ。
pop3.awk
BEGIN { username = "username" start = 0 username1st = sprintf("USER.%s", substr(username, 1, 3)) username2nd = substr(username, 4, 16) } $1 ~ /^[0-9][0-9]:/ { lasttime = $1 } $1 ~ "0x0020:" && $NF ~ /^P/ && $NF ~ username1st { start = 1 lastline = $NF } $1 ~ "0x0030:" && $NF ~ username2nd { if ( start == 1 ) { print lasttime, ":" , lastline $NF start = 2 } } $1 ~ "0x0020:" && $NF ~ /^P/ && $NF ~ "QUIT" { if ( start == 2 ) print lasttime, ":" , $NF start = 0 } $1 ~ "0x0020:" && $NF ~ /^P/ && $NF !~ "PASS" { if ( start == 2 ) print lasttime, ":" , $NF }
実行例
# tcpdump -X -s 128 port 110 and src host サーバ名 2>&1 2> /dev/null | awk -f pop3.awk 15:33:56.169345 : P...f7..USER.username.. 15:33:56.365534 : P............. 15:33:56.369747 : P.......STAT.. 15:33:56.374015 : P.......QUIT..
POPのコマンドの分別のところをtcpdumpの条件式で ip[0x28] & 0xff > 'A' and ip[28] & 0xff < 'Z' みたいに書けないものか?