2015-09-03 35 views
-2

我試圖爲Windows創建一個腳本,它只計算系統上的Established,Time_Wait和Closed_Wait連接數並在命令提示符下打印它們。我已經制作了一個shell腳本,可以在Linux上執行此操作,但shell腳本無法在Windows中運行。我試圖使用.bat來執行腳本,但這不起作用(可能是因爲它仍然是Windows中的一個shell腳本:/)它必須只顯示Established,Time_Wait和Closed_Wait的原因是因爲腳本正在如果有任何其他連接類型出現,監控程序將使用此功能。任何人都可以提出建議嗎?謝謝!腳本只計數Established,TIME_WAIT和Closed等待連接使用Netstat

+0

您使用什麼參數來生成輸入,並請提供輸出的準確樣本。 – stevieb

+0

我的Linux腳本的原始輸入是:ESTABLISHED ='netstat -nat | egrep'ESTABLISHED'| wc -l' TIME_WAIT ='netstat -nat | egrep'TIME_WAIT'| wc -l' CLOSE_WAIT ='netstat -nat | egrep'CLOSE_WAIT'| wc -l' SYN_SENT ='netstat -nat | egrep'SYN_SEND'| wc -l' SYN_RECV ='netstat -nat | egrep'SYN_RECVEIVED'| wc -l' echo $ ESTABLISHED echo $ TIME_WAIT echo $ CLOSE_WAIT echo $ SYN_SENT echo $ SYN_RECV輸出應該只是5個獨立線路上每個連接狀態的計數。 – monkeychef

+0

@monkeychef您應該使用該信息編輯原始帖子。 –

回答

1

以下(應該)在沒有對* nix和Windows進行任何更改的情況下工作。我在Ubuntu w/Perl v.5.18.0,Linux Mint w/Perl v5.22.0和Win2k8R2(w/Strawberry Perl v5.8.8)上測試過它。

#!/usr/bin/perl 
use strict; 
use warnings; 

my @stat = split '\n', `netstat -nat`; 

my @wanted = qw(
       ESTABLISHED 
       TIME_WAIT 
       CLOSED_WAIT 
       SYN_SENT 
       SYN_RECV 
      ); 

my %data = map {$_ => 0} @wanted; 

for (@stat){ 
    s/^\s+//; 

    my $status; 

    if ($^O eq 'MSWin32'){ 
     $status = (split)[3]; 
    } 
    else { 
     $status = (split)[5]; 
    } 

    next if ! $status; 

    $data{$status}++ if defined $data{$status}; 
} 

print "$data{$_}\n" for @wanted; 
+0

這太棒了,謝謝!我試圖通過修改第6行並在最後添加兩行來添加另外兩個狀態(syn_sent和syn_received),但似乎會破壞腳本。是否有某種方法需要完成? – monkeychef

+0

我做了一些重大的效率變更。如果你想添加更多的條目,把它們放在'@ wanted'列表中。輸出按「@ wanted'列表的順序打印。您可以從該列表中添加/刪除,並且不會影響輸出以外的任何內容。 – stevieb

+1

非常感謝您的幫助,這太棒了! – monkeychef