PowerShell의 netstat 필터링 논리 포함/제외

PowerShell의 netstat 필터링 논리 포함/제외

현재 우리는 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_*'}.

그러나 우리는 스크립트를 동시에 실행하는 경우 다른 시간에 발생할 수 있는 다른 옵션을 놓치고 싶지 않습니다. 방금 찾은 것 중 하나는LAST_ACK그리고 우리 논리에 아직 포함되지 않은 다른 옵션이 무엇인지 모르겠습니다.

모든 일치 항목을 필터링하는 대신 해당 논리를 뒤집는 방법이 있습니까? 다음 중 하나에 해당하는 일치 항목만 포함할 수 있습니까?(공백)또는청취또는루프백이 아닌 IP? 그렇지 않다면 그 논리에 더 많은 것을 추가할 수 있지만 일부 전문가의 생각을 보고 싶었을 뿐입니다.

답변: 모든 주를 찾았습니다.여기모든 항목을 포함하도록 업데이트했습니다.

답변1

필요하지 않을 때 바퀴를 재발명하지 마십시오. 합법적인 질문은 이미 웹 전체에서 다양한 방식으로 여러 번 질문되고 답변되었을 가능성이 있습니다. 한 번의 검색으로 절대적인 답변을 찾지 못할 수도 있으며, 다른 문자열(들), 문자열 일치, 정확한 문자열 일치, 부분 문자열 일치, 사이트별 일치 등을 사용하여 검색해야 할 수도 있습니다.

예: 'powershell 필터 netstat'

조회수

Get-NetworkStatistics - 필터링이 포함된 netstat -ano

이 코드는 Shay Levy의 Get-NetworkStatistics 함수에서 차용한 것입니다. 이 기능은 로컬 또는 원격 시스템에서 netstat -ano를 실행하고 지정된 경우 프로세스 이름, 주소, 포트, 프로토콜 또는 상태별로 결과를 필터링합니다. get-process를 사용하여 각 PID에 대해 프로세스 이름을 가져옵니다.

https://gallery.technet.microsoft.com/scriptcenter/Get-NetworkStatistics-66057d71

다운로드:https://gallery.technet.microsoft.com/scriptcenter/Get-NetworkStatistics-66057d71/file/68504/10/Get-NetworkStatistics.ps1

있는 그대로 사용하거나 필요에 따라 수정하세요.

답변2

내 생각에 당신이 원하는 것을 처리하는 한 가지 방법은 다음과 같습니다. 텍스트 줄을 원하는 대로 필터링할 수 있는 PoSh 개체로 변환합니다. 이것은 제가 3~4년 전에 작성한 오래된 코드입니다.

그것이 무엇을 하는지 ...

  • netstat$Var에 대한 호출 결과를 저장합니다.
  • 불필요한 줄을 정리합니다.
  • 각 줄을 CSV 줄로 변환합니다.
  • CSV 라인 모음을 PoSh 객체 배열로 변환합니다.
  • 컬렉션을 표시합니다
  • .PID0번째 객체의 속성을 표시합니다.

코드 ...

$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.

관련 정보