目前,我們使用 PowerShell 中的一些邏輯來netstat -ano
取得所有 TCP 和 UDP 結果並過濾掉我們不需要查看的結果,然後將其匯出到 CSV。我們希望結果只包括聽力和(空白的)和非環回IP。
一個例子是netstat -ano | Where-Object{$_ -notlike '*127.?.?.?*' -and $_ -notmatch '\[::1]' -and $_ -notmatch 'TIME_WAIT' -and $_ -notmatch 'CLOSE*' -and $_ -notmatch 'ESTABLISHED' -and $_ -notmatch 'SYN_*' -and $_ -notmatch 'FIN_*'}
。
但是,如果我們碰巧同時運行腳本,我們不想錯過其他時間可能出現的其他選項。我剛剛發現的一個是最後_ACK我不知道還有哪些其他選項是我們的邏輯尚未包含的。
有沒有一種方法可以翻轉該邏輯,而不是過濾掉所有這些匹配項,我們可以只包含以下匹配項嗎(空白的)或者聽力或者非環回IP?如果沒有,我可以在這個邏輯中添加更多內容,但只是想看看一些專家的想法。
答:我找到了所有的州這裡並剛剛更新它以包含所有這些。
答案1
不必要時不要重新發明輪子。任何合法的問題都可能已經在網路上以多種方式被多次提出和回答。您可能無法在一次搜尋中找到絕對答案,並且可能需要使用不同的字串、字串匹配、精確字串匹配、部分字串匹配、特定於網站的匹配等進行搜尋。
命中
取得網路統計 - netstat -ano 帶過濾
此程式碼借用 Shay Levy 的 Get-NetworkStatistics 函數。此函數在本機或遠端系統上執行 netstat -ano 並按進程名稱、位址、連接埠、協定或狀態(如果指定)過濾結果。使用 get-process 為每個 PID 提取進程名稱。
https://gallery.technet.microsoft.com/scriptcenter/Get-NetworkStatistics-66057d71
按原樣使用或根據需要進行修改。
答案2
這是處理我認為您想要的內容的一種方法...將文字行轉換為 PoSh 對象,您可以根據需要進行過濾。這是我三、四年前寫的舊程式碼。
它能做什麼 ...
- 將呼叫結果儲存
netstat
到 $Var - 清除不需要的線條
- 將每一行轉換為 CSV 行
- 將 CSV 行集合轉換為 PoSh 物件數組
- 顯示集合
- 顯示
.PID
第 0 個物件的屬性
代碼 ...
$Raw_Result = netstat -a -o -n
# get rid of the unwanted 1st three lines
$Raw_Result = $Raw_Result | Select-Object -Skip 3
# remove the `---` line
$Raw_Result = $Raw_Result | Select-String -Pattern '[^---]'
$Cleaned_Result = foreach ($Line in $Raw_Result)
{
$Line = $Line.ToString().Trim()
if ($Line[53] -eq ' ')
{
$Line = $Line.Insert(53, '-NA-')
}
$Line = $Line -replace ' {2,}', ','
$Line
}
$Final_Result = $Cleaned_Result | ConvertFrom-Csv
#$Raw_Result
#$Cleaned_Result
$Final_Result
Write-Output ''
$Final_Result[0].PID
截斷的輸出...
Proto : UDP
Local Address : [::]:55356
Foreign Address : *:*
State : -NA-
PID : 3352
[*...snip...*]
Proto : UDP
Local Address : [fe80::d129:4be7:98da:e357%14]:53382
Foreign Address : *:*
State : -NA-
PID : 3908
1308
所有這些工作的好處是,您現在擁有一個易於排序或過濾的相當標準的物件集合。 [咧嘴笑]
答案3
我找到了所有的州這裡並剛剛更新它以包含最後一個,現在它們都在那裡。它們如下:
CLOSE_WAIT、CLOSED、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、LAST_ACK、LISTEN、SYN_RECEIVED、SYN_SEND 和 TIME_WAIT。