実はPowerShell 2.0まではObject処理できるコマンドが存在せずnetstatをテキスト処理してobjectに入れてほげほげしてました。 しかしPowerShell 3.0で追加されたnetstatに相当するコマンドでPowerShell風にobject処理できます。 それが今回のお題。 Windows Server管理しているには利用していただきたいものです。
PowerShellでの netstat 分析は大勢に望まれていた
実際PowerShell netstatなどで検索すると、海外で沢山記事が出ます。
netstatの統計/分析はWindowsだけでなくLinuxでも大事ですね。linuxだとwc -lなどテキスト処理がしやすく件数集計も簡単です。
以前、フォロワーさんのリクエストでPowerShellを使ってnetstat解析して出力するスクリプトを作りましたが、PowerShell 3.0ではそんな手間は要りません。
Get-NetTCPConnection Cmdletの存在
PowerShell 3.0から追加されました。 これを利用するとnetstatのあのカラムがそれぞれobjectとして処理されます。
Get-NetTCPConnection
もうじきPowerShell 4.0が出ますが、 いまだにこのコマンドレットは無名に近いようです。
出力例
見事にnetstatがそのまま出てますね。
LocalAddress LocalPort RemoteAddress RemotePort State AppliedSetting ------------ --------- ------------- ---------- ----- -------------- fe80::6cae:d295:51ef:5229%33 52535 fe80::6cae:d295:51ef:5229%33 445 Established Internet :: 49160 :: 0 Listen :: 49156 :: 0 Listen :: 49154 :: 0 Listen :: 49153 :: 0 Listen :: 49152 :: 0 Listen :: 47001 :: 0 Listen :: 10243 :: 0 Listen :: 5985 :: 0 Listen :: 5357 :: 0 Listen :: 3587 :: 0 Listen :: 2869 :: 0 Listen :: 554 :: 0 Listen fe80::xxxx:xxxx:xxxx:xxxx%33 445 fe80::xxxx:xxxx:xxxx:xxxx%33 52535 Established Internet :: 445 :: 0 Listen :: 135 :: 0 Listen :: 80 :: 0 Listen 192.168.11.50 64829 xx.xxx.zzz.163 443 Established Internet 192.168.11.50 64828 xxx.xx.zzz.147 80 Established Internet 192.168.11.50 64827 xx.xxx.rr.169 80 CloseWait Internet 192.168.11.50 64826 xxx.yy.sss.41 443 CloseWait Internet 192.168.11.50 64825 xxx.yy.sss.41 443 CloseWait Internet
パラメータで簡易フィルタ
もちろん各種パラメーターもあります。 -LocalAddressなら指定したアドレスに絞ることもできます。
Get-NetTCPConnection -LocalAddress 127.0.0.1
-LocalPortなら指定したローカルポートに
Get-NetTCPConnection -LocalPort 80
Where-Objectでの詳細分析を必要としない特定のポートだけとかなら十分です。
他Cmdlet との連携
Cmdletの最大のメリットはPiple Orientationです。 つまり、サクッとパイプでつなげて利用できるのです。 例えば接続状態のステータス統計をとるならGroup-Objectで!
Get-NetTCPConnection | group state -NoElement
出力です。
Count Name ----- ---- 83 Established 29 Listen 8 TimeWait 6 CloseWait
もちろん特定のリモートポートでのState統計も出来ますね。
Get-NetTCPConnection -RemotePort 80 | group state -NoElement
欠点
処理が遅いです。 1000桁までは平気ですが、4桁とかなるとgroup集計などが遅延して目も当てられません。 Linuxなら一瞬なのに。
監視につかうなら
監視としてずっと廻しておくならwhileでさくっとしてもいいでしょう。
while ($true) {Get-NetTCPConnection | group state -NoElement; sleep 1}
この辺は、 謎社CTOもPowerShell が役にたったようなので何よりです。
あと、監視に使うならnetstat -aonも1秒連続実行などで併用しましょう。 特定のポートならfindstrで絞って。 80番ならこう。 TCPを加えるならもう一本 | でfindstrでいいでしょう。
netstat -aon 1 | findstr :80
こうすることで、統計されていない流速がみれるので肌感覚が分かります。
まとめ
ということで、 超素敵コマンドでした。 こういう時、 cmdで死んでいたnetstatの分析が、楽になっているのを実感してPowerShellの プロパティアクセスが楽だと感じますね。
後は速度! なのですよ。