Свести вывод команды netstat в powershell - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь использовать netstat -bano и собирать выходные данные в PowerShell для некоторых очень специфических требований к отчетности.

У меня есть работающее регулярное выражение, которое должно быть в состоянии проанализировать этот вывод без проблем, но так как вывод появляетсяв нескольких строках регулярное выражение обрабатывается неправильно

Вот скриншот того, как это получается из netstat

sample output

желаемый результат примерно такой (все в одной строке):

TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1092  RpcSs [svchost.exe]
TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4     Can not obtain ownership information
TCP    0.0.0.0:623            0.0.0.0:0              LISTENING       7404  [LMS.exe]
TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       1224  TermService [svchost.exe]

использование инструментов вне Windows невозможно, поэтому я ограничен общими инструментами.

Использование Get-Process сопоставления на PID также не будет работать, так как оно скрывает информацию о подпроцессах в svchost и lsass.netstat с -b идеально подходит, потому что показывает как svchost.exe, так и процесс, использующий порт

Я искал интернет, чтобы найти жизнеспособное решение, но большинство заканчивалось в другом разрешении

РЕДАКТИРОВАТЬ ** вот мой последний сценарий с использованием информации от вас, ребята

$data = (netstat -bano |select -skip 4 | Out-String) -replace '(?m)^  (TCP|UDP)', '$1' -replace '\r?\n\s+([^\[])', "`t`$1" -replace '\r?\n\s+\[', "`t[" -split "`n"

[regex]$regex = '(?<protocol>TCP|UDP)\s+(?<address>\d+.\d+.\d+.\d+|\[::\]|\[::1\]):(?<port>\d+).+(?<state>LISTENING|\*:\*)\s+(?<pid>\d+)\s+(?<service>Can not obtain ownership information|\[\w+.exe\]|\w+\s+\[\w+.exe\])'

$output = @()

$data | foreach {
    $_ -match $regex

    $outputobj = @{
        protocol = [string]$matches.protocol
        address = [string]$matches.address -replace '\[::\]','[..]' -replace '\[::1\]','[..1]'
        port = [int]$matches.port
        state = [string]$matches.state -replace "\*:\*",'NA'
        pid = [int]$matches.pid
        service = ([string]$matches.service -replace 'Can not obtain ownership information','[System' -split '.*\[')[1] -replace '\]',''
        subservice = ([string]$matches.service  -replace 'Can not obtain ownership information','' -split '\[.*\]')[0]
    }
    $output += New-Object -TypeName PSobject -Property $outputobj
}
$output |select address,port,protocol,pid,state,service,subservice

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Я бы, вероятно, сделал что-то вроде этого:

  1. объединить вывод в одну строку:

    netstat -bano | Out-String
    
  2. удалить отступстроки, начинающиеся с UDP или TCP, чтобы их можно было отличить от других строк:

    -replace '(?m)^  (TCP|UDP)', '$1'
    
  3. соединяют все строки с отступом, которые не начинаются с квадратной скобки, с предшествующей им строкой:

    -replace '\r?\n\s+([^\[])', "`t`$1"
    
  4. объединить все отступы, начинающиеся с квадратной скобки, с предшествующей им строкой:

    -replace '\r?\n\s+\[', "`t["
    

Полный оператор:

(netstat -bano | Out-String) -replace '(?m)^  (TCP|UDP)', '$1' -replace '\r?\n\s+([^\[])', "`t`$1" -replace '\r?\n\s+\[', "`t["
0 голосов
/ 06 декабря 2018

Вы можете присоединиться к выводу netstat, чтобы он стал одной большой многострочной строкой, а затем разбить ее на строки, начинающиеся с пробела, за которыми следуют TCP или UDP, а затем IP-адрес (чтобы удалить ложные срабатывания приложения, имеющегоимя «TCP-трекер» или что-то).Затем обрежьте все пробелы в начале или конце строки, замените запятыми в любом месте, где есть два или более пробелов, и перенесите результаты в ConvertFrom-Csv для создания объектов.Исходя из этого, вы можете отфильтровать, сгруппировать или просто перенаправить на Format-Table, чтобы увидеть результаты.

$Netstat = (netstat -bano | Select -skip 2) -join "`n" -split "(?= [TU][CD]P\s+(?:\d+\.|\[\w*:\w*:))" | 
    ForEach-Object {$_.trim() -replace "`n",' ' -replace '\s{2,}',','} |
    ConvertFrom-Csv
# Filter the results for TCP connections and pipe the results to Format-Table
$Netstat | Where {$_.Proto -eq 'TCP'} | Format-Table
...