tech.guitarrapc.cóm

Technical updates

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 とかもありますし件数集計も簡単です。

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

 

後は速度!なのですよ。