以下の内容はhttps://tech.guitarrapc.com/entry/2013/08/10/220848より取得しました。


PowerShellでnetstatをするにはどうするの

実は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の プロパティアクセスが楽だと感じますね。

後は速度! なのですよ。




以上の内容はhttps://tech.guitarrapc.com/entry/2013/08/10/220848より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14