netstat z nazwą procesu?

46

Za pomocą netstat -a -o -n mogę uzyskać listę portów i PID

następnie muszę przejść do menedżera zadań i dodać PID i zobaczyć, kto to jest. (dość frustrujące)

wprowadź opis zdjęcia tutaj

Byłem więc dziwnego, gdyby nie to polecenie CMD, który robi wszystko (za pomocą find, for, powershell)

żebym mógł uzyskać nazwę procesu

Royi Namir
źródło
netstat -b jako admin, np. netstat -abon. A nazwa exe jest poniżej
barlop

Odpowiedzi:

56

Rozwiązanie

Użyj -bparametru:

  -b            Displays the executable involved in creating each connection or
                listening port. In some cases well-known executables host
                multiple independent components, and in these cases the
                sequence of components involved in creating the connection
                or listening port is displayed. In this case the executable
                name is in [] at the bottom, on top is the component it called,
                and so forth until TCP/IP was reached. Note that this option
                can be time-consuming and will fail unless you have sufficient
                permissions.

Uwaganetstat -b komenda zawiedzie chyba uruchomić z wiersza polecenia z.

Obejście

Filtruj listę procesów i znajdź PID, który Cię interesuje:

tasklist | findstr /c:"PID"  


Alternatywne rozwiązanie

Zamiast tego możesz użyć Tcpvcon.exe. Nie wymaga uprawnień administratora.

Użycie Tcpvcon jest podobne do użycia wbudowanego netstatnarzędzia Windows .

Usage: tcpvcon [-a] [-c] [-n] [process name or PID]

 -a Show all endpoints (default is to show established TCP connections).
 -c Print output as CSV.
 -n Don't resolve addresses.
i31415
źródło
1
jesteś mężczyzną.
Royi Namir
dobra odpowiedź, tylko komentując, że myślę, że to zabawne, jak ms /? dokumentacja mówi nawet, że „ta opcja może być czasochłonna”! i jest to głupota okien, która jest czasochłonna. Netstat Linuksa szybko pokazuje swoją nazwę pliku wykonywalnego. A także pokazanie nazwy pliku wykonywalnego linuxa nie wymaga uprawnień roota / administratora
barlop
8

Myślę, że szukasz TCPView z SysInternals .

Leptonator
źródło
Zastanawiałem się, czy istnieje polecenie CMD, które to wszystko robi
Royi Namir
Kontynuuj - Istnieje komponent TCPView wiersza polecenia.
Leptonator
o ok pomyślałem, że może ktoś już to zrobił, używając, znaleźć itp.
Royi Namir
Nie powinno to być zbyt trudne. Założę się, że robvanderwoude.com ma coś na ten temat. Na stronie TCPView - „Pobieranie TCPView obejmuje Tcpvcon, wersję wiersza polecenia o tej samej funkcjonalności”.
Leptonator
Bardzo dobry zestaw narzędzi .. gdyby nie msys i sis, użyłbym skrzynki nix. :)
Eddie B,
2

Oto przykład okien używających FORparsowania netstatdanych wyjściowych, a następnie DO tasklistz /fifiltrem na pid, aby wyświetlić nazwę procesu.

Ostatnim znaleziskiem jest usunięcie tasklistnagłówków.

FOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|find "443"`) DO @tasklist /fi "pid eq %i" | find "%i"

wypisuje dane wyjściowe jak

tomcat8.exe.x64               4240 Services                   0    931,864 K

Dodatkowe pola z netstatmożna dodać, dodając tokeny.

znak
źródło
Zalety tego rozwiązania, w tym: 1. użycie finddo odfiltrowania portów (w przeciwieństwie do tego, chociaż netstat -bmożna podać nazwę procesu bezpośrednio, ale przejście przez jego wyniki w celu ręcznego wyszukiwania jest bolesne i podatne na błędy); 2. Używanie tylko rodzimych poleceń systemu Windows, które jest bardziej elastyczne i niezależne.
Yingyu YOU
1
Możliwa poprawa: 1. używanie findstrz /Ropcją zamiast użycia findwyrażenia regularnego dla lepszego wyszukiwania; 2. użyć :443 *[[0-9]"jako wzorca do odfiltrowania tylko portu lokalnego . Całe polecenie mogłoby byćFOR /F "usebackq tokens=5 delims= " %i IN (`netstat -ano ^|findstr /R /C:":443 *[[0-9]"`) DO @tasklist /fi "pid eq %i" | findstr "%i"
Yingyu YOU
@DavidPostill lub @mark Czy możesz wyjaśnić „ netstatMożna dodać dodatkowe pola, dodając tokeny”.
Yves Schelpe,
2

Jeśli lubisz korzystać z PS, możesz rozwidlić ten kod (uwaga: jest on bardzo podstawowy)

$nets = netstat -ano | select-string LISTENING
foreach($n in $nets){
    # make split easier PLUS make it a string instead of a match object:
    $p = $n -replace ' +',' '
    # make it an array:
    $nar = $p.Split(' ')
    # pick last item:
    $pname = $(Get-Process -id $nar[-1]).ProcessName
    $ppath = $(Get-Process -id $nar[-1]).Path
    # print the modified line with processname instead of PID:
    $n -replace "$($nar[-1])","$($ppath) $($pname)"
}

Zauważ, że możesz spróbować Pathzamiast ProcessNameuzyskać pełną ścieżkę wykonywalną - nie będzie to jednak działać z usługami systemowymi. Możesz także dodać ProcessNamekoniec na końcu linii zamiast zastępować wartość PID.

Ciesz się;)

Erik Bitemo
źródło
1

Spróbuj użyć tego ...

Nazwa procesu ze znacznikiem czasu :) w oneliner ... nie ma potrzeby szybkiego i łatwego pisania skryptów ...

Możesz zmienić parametr SYN_SENT przez ESTABLISHED lub LISTENING

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

filter timestamp {"$(Get-Date -Format G): $_"};netstat -abno 1 | Select-String -Context 0,1 -Pattern SYN_SENT|timestamp
Jhon Willmaure
źródło
Użyłem tego ze wzorem na ip: port, który chciałem obserwować. Świetny urywek!
Alex
0

Bardzo fajny Erik Bitemo! Myślałem o dodaniu zmiennej do ścieżki, a potem zdałem sobie sprawę, że już ją masz, chociaż nie została zdefiniowana. Kod, którego użyłem ponownie to:

$nets = netstat -ano |select-string LISTENING;
foreach ($n in $nets)
    {
# make split easier PLUS make it a string instead of a match object
    $p = $n -replace ' +',' ';
# make it an array
    $nar = $p.Split(' ')
# pick last item...
    $pname = $(Get-Process -id $nar[-1]).ProcessName
    $ppath = $(Get-Process -id $nar[-1]).Path;
# print the modified line with processname instead of PID
    $n -replace "$($nar[-1])","$($ppath) $($pname)" | where {$pname -like "*GMSVP*"}
     }

Próbowałem znaleźć procesy i usługi dla aplikacji, w której użyłem nieco innej 2-liniowej.

Get-Service | select status,name,displayname,servicename | where {($_.DisplayName -like "myserv*") -or ($_.servicename -like "post*")} | ft -auto

Get-Process | select id, processname,cpu,path,description | where {$_.path -like "*myserv*"} | ft -auto
Ratan Mohapatra
źródło
Zredagowałem pytanie Erika, aby uwzględnić poprawkę, więc jeśli chcesz, możesz usunąć je z odpowiedzi i skoncentrować się na swoim podejściu za pomocą GetServicei Get-Process.
flolilo