Aktivieren Sie einen Einzeiler, um den Prozess in derselben Zeile wie den Port anzuzeigen, der die Netstat-Ausgabe verwendet

3339
Ric

Zuerst möchte ich nur sicherstellen, dass Benutzer Erik Bitemo den ursprünglichen Code, den ich hier verwende, gutschreibt. Die Ausgabe ist das, wonach ich suche, mit einer Ausnahme: Einer der Ports verschwindet und "System System5" erscheint an seiner Stelle, und ich kann nicht herausfinden, warum es passiert.

Ziel: Zeigen Sie alle TCP (Listening) - und UDP-Ports und den zugehörigen Prozess in derselben Zeile an.

Ein Liner wird verwendet:

$nets = netstat -bano|select-string 'LISTENING|UDP'; foreach ($n in $nets) { $p = $n -replace ' +',' '; $nar = $p.Split(' '); $pname = $(Get-Process -id $nar[-1]).ProcessName; $n -replace "$($nar[-1])","$($ppath) $($pname)"; } 

Beispielausgabe:

TCP 0.0.0.0:135 0.0.0.0:07 HÖREN svchost
TCP 0.0.0.0: System System5 0.0.0.0:07 HÖREN System
TCP 0.0.0.0:623 0.0.0.0:08 LISTENING LMS

Der Port, den es ändert, ist 445, aber ich habe keine Ahnung, warum er nur diesen Port ändert, wenn die übrigen Ports wie beabsichtigt funktionieren. Warum ändert sich das Skript 445 in "System System5"?

Die Verwendung anderer Tools ist leider nicht möglich, daher bin ich auf die Verwendung von integrierten Windows-Tools beschränkt.

3
Bitte [bearbeiten] Sie die Frage und geben Sie die Rohausgabe von `netstat -bano | select-string 'LISTENING | UDP' 'an DavidPostill vor 6 Jahren 0

3 Antworten auf die Frage

3
JosefZ

$pkönnte so etwas wie TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4und $nar[-1]ist string, 4so dass der -replaceOperator alle 4 s nimmt:

TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 ↑↑ ↑ 

Erzwinge das Ersetzen nur des letzten Vorkommens der $nar[-1]Verwendung des Endes des Linienankers (escape $):

$p -replace "$($nar[-1])`$","$ppath $pname" 

Lesen Sie auch die Antwort von Matt auf Ersetzen des letzten Vorkommens der Teilzeichenfolge in Zeichenfolge bei stackoverflow.

BTW:

  • $ppath ist nicht definiert…
  • … Und netstat -anosollte ausreichen (beachten Sie, dass diese -bOption zeitaufwändig sein kann und fehlschlägt, wenn Sie nicht über ausreichende Berechtigungen verfügen).
Sie haben das Problem mit Sicherheit gefunden. Ich habe auch Vorschläge für dieses Problem gemacht, wenn Sie neugierig sind. Matt vor 6 Jahren 0
3
Matt

Die Antwort von JosefZ erklärt Ihr Problem perfekt. Sie verwenden Regex und tun genau das, was Sie möchten, und ersetzen vielleicht mehr als Sie erwartet haben.

Eine Randnotiz ist, dass Sie fragen netstatnach

Zeigt die ausführbare Datei an, die zum Erstellen der einzelnen Verbindungs- oder Überwachungsports benötigt wird

mit dem Schalter b. Sie verwerfen dies jedoch, select-stringda dieser Prozess in einer eigenen Zeile nach den anderen Daten angezeigt wird. Das ist nicht das Ende der Welt, sondern weil man Dinge wie kann -Contextvon Select-Stringbekommen, dass aber das muss genau einen späteren Zeitpunkt auf mehr betrachtet werden.

Ich möchte weitere Vorschläge dazu machen, was Sie in dieser Situation tun können.

Die Verwendung anderer Tools ist leider nicht möglich, daher bin ich auf die Verwendung von integrierten Windows-Tools beschränkt.

Lustig, haben Sie mindestens Windows 8? In diesem Get-NetTCPConnectionFall könnten Sie einfach das Cmdlet verwenden, das sich im Wesentlichen netstatin Objektform befindet.

So könnten Sie dies tun, wodurch Sie dieselben Informationen erhalten, ohne dass Sie sich darum kümmern müssen

get-nettcpconnection | select local*,remote*,state,@} 

Sie haben kein Windows 8+? Dann könnten wir Ihr Parsing-Skript verbessern. Wenn Sie beim Erstellen eines Objekts noch einen Schritt weitergehen, wird das Problem beim Regex-Abgleich vermieden.

netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{ $split = $_.Trim() -split "\s+" [pscustomobject][ordered]@{ "Proto" = $split[0] "Local Address" = $split[1] "Foreign Address" = $split[2] # Some might not have a state. Check to see if the last element is a number. If it is ignore it "State" = if($split[3] -notmatch "\d+"){$split[3]}else{""} # The last element in every case will be a PID "Process Name" = $(Get-Process -Id $split[-1]).ProcessName } } 

Wenn Sie auf PowerShell v2 beschränkt waren, müssen Sie das psobject und die bestellten Casts ändern

netstat -ano | Where-Object{$_ -match 'LISTENING|UDP'} | ForEach-Object{ $split = $_.Trim() -split "\s+" New-Object -Type pscustomobject -Property @{ "Proto" = $split[0] "Local Address" = $split[1] "Foreign Address" = $split[2] # Some might not have a state. Check to see if the last element is a number. If it is ignore it "State" = if($split[3] -notmatch "\d+"){$split[3]}else{""} # The last element in every case will be a PID "Process Name" = $(Get-Process -Id $split[-1]).ProcessName } } | Select "Proto", "Local Address", "Foreign Address", "State", "Process Name"  

Die letzte selectAnweisung garantiert die Eigenschaftsreihenfolge, die andernfalls gemischt würde und dem funktionalen Äquivalent entspricht[ordered]

Also das wird Sie wie folgt ausgeben ...

Proto Local Address Foreign Address State Process Name  ----- ------------- --------------- ----- ------------  TCP 0.0.0.0:135 0.0.0.0:0 LISTENING svchost  TCP 0.0.0.0:445 0.0.0.0:0 LISTENING System  TCP 0.0.0.0:1279 0.0.0.0:0 LISTENING PlexDlnaServer TCP 0.0.0.0:2869 0.0.0.0:0 LISTENING System  

Das können Sie dann wie jedes PowerShell-Objekt behandeln und so filtern, wie Sie es für CSV oder für die Ausgabe in CSV oder für das, was Sie tun müssen, finden. Es ist jetzt strukturiert.

Abhängig von Ihrer PowerShell-Version können Sie auch verwenden, Convert-FromStringdass einzeilige Zeichenfolgen verwendet und in Objekte konvertiert werden. Noch etwas zum Nachschlagen.

Das war sehr hilfreich. Vielen Dank für Ihre Hilfe. Ric vor 6 Jahren 0
Ihre Lösung wäre ideal, aber es scheint, dass mindestens Powershell 3 oder 4 erforderlich ist. Wenn sie auf einem Windows 7-Computer ausgeführt wird, tritt ein Fehler auf. Können Änderungen vorgenommen werden, um dies zu vermeiden? Der Fehler lautet "Typ kann nicht gefunden werden [bestellt]: Stellen Sie sicher, dass die Assembly mit diesem Typ geladen ist." Ric vor 6 Jahren 0
Diese Abgüsse würden ein Problem mit Ja verursachen. Einfach zu adressieren. Ich werde ein kurzes Update für Sie hinzufügen. Matt vor 6 Jahren 1
Die Prozessinformationen scheinen in Windows 2012 nicht verfügbar zu sein (nicht R2). Wahrscheinlich ist es auch in Windows 8.0 nicht verfügbar. Thorarin vor 5 Jahren 0
0
Jhon Willmaure

Einfacher...

filter timestamp {"$(Get-Date -Format G): $_"};netstat -abno 1 | Select-String -Context 0,1 -Pattern LISTENING|timestamp