読者です 読者をやめる 読者になる 読者になる

KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

バッシュワンライナーを目指して--The road to Bash One-Liners!

shell script Linux netstat one liner

魔法の呪文を唱えるのに少しずつ慣れてきた今日この頃。まさに幼児が言葉を覚えていくときのように少しずつ長い呪文を唱えられるようになってきました。


photo by Xtream_i

最近の個人的な流行は、

while true; do [定期実行したいコマンド]; sleep [実行間隔の秒数]; done

という、無限ループ構文。 終わりたければ、Ctrl + cで抜ければいいだけだからお手軽。

なかなか便利に使えたなと思ったのは、RAIDのリビルドの進捗状況の確認兼記録のとき。

while true; do date; tw_cli /c0 show; sleep 30; done

ってな具合に唱えてあげることで、日付とRAIDの状況の表示が出続けてくれました。ターミナルをどっか端っこに置いとけば終わったタイミングもわかるのでなかなかよかったです。

となってくると、目指すは、「ワンライナー」なんでしょう。と斉藤は勝手に思っています。

ワンライナー」って何ですかって最初は思いましたので、Google先生に聞いてみましたら、

ejje.weblio.jp

確かに、職場がピリピリしすぎると、無駄な緊張状態によって能力を発揮しきれなくなってしまうから、ウィットに富んだ一言でもかませれば、それは素晴らしい人だ!

ということではないのは、自明であって、

d.hatena.ne.jp

ってことなんだそうです。

ということで、わたくしの最初のワンライナーが本日産声を挙げましたのでご紹介。

netstat -nt | grep -e 'tcp ' | sed 's/[[:space:]]\{1,\}/:/g' | cut -d ':' -f 6 | sort | uniq -c | sort -r | head -n5

やりたかったこと

ただそれだけです。 不届き者がコネクションを作りまくって悪だくみしていないかの確認をするときとか、実際にコネクションが大量に発生していると、普通にnetstatで表示しても、どれが多いんだかよくわからない事態にしばしば陥っていたので、なんとかなったらいいなぁという切なる願いです。

$ netstat -tn
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0    352 203.0.113.244:22       198.51.100.10:61020     ESTABLISHED
tcp        0    352 203.0.113.244:22       198.51.100.11:61021     ESTABLISHED
tcp        0    352 203.0.113.244:22       198.51.100.12:61022     ESTABLISHED
tcp        0    352 203.0.113.244:22       198.51.100.13:61023     ESTABLISHED

なんかこんなのが出ますよね。 このぐらいの量なら、大したことないんですけど、大量にあると悲しくなってくるので…。

$ netstat -nt | grep -e 'tcp ' | sed 's/[[:space:]]\{1,\}/:/g' | cut -d ':' -f 6 | sort | uniq -c | sort -r | head -n5
  20 198.51.100.10
  12 198.51.100.15
  11 198.51.100.22
  10 198.51.100.101
   9 198.51.100.13

ってな具合で出力されます。IPアドレスの先頭には、重複数が出ているので、これとIPアドレスwhois情報をもとに悪そうなやつをブロックしてやりましょうという算段です。

なんか、もうちょっとスマートにならないかなと思います。アイディア募集です。ちなみに、簡易的な動作確認は、ubuntu14.04 LTSでのみの実施済みです。なんかsedの仕様が2つばかしあるようなので、正規表現がうまくどの環境でも効くか…。