実は PowerShell 2.0 まではObject処理できるコマンドが存在せず netstat をテキスト処理して objectに入れてほげほげしてました。
しかし PowerShell 3.0 で追加された netstat に相当するコマンドで PowerShell 風に object処理できます。 それが今回のお題。
Windows Server 管理している人で知らない方には利用していただきたいものです。
PowerShellでの netstat 分析は大勢に望まれていた
実際 PowerShell netstat などで検索すると、海外で沢山記事が出ます。それぐらい望まれていたのです。 (日本は アレですが)
netstat の統計、分析は Windows だけでなく Linux でも大事ですね。linux だと結構容易にテキスト処理できるんです。 wc -l とかもありますし件数集計も簡単です。
しかし Windows には cmd が..... 絶望した。以前、フォロワーさんのリクエストで 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 の プロパティアクセスが楽だと感じますね。
後は速度!なのですよ。