netstat с именем процесса?


46

Используя netstat -a -o -n я могу получить список портов и PID

тогда мне нужно пойти в диспетчер задач и добавить PID и посмотреть, кто это. (довольно расстраивает)

введите описание изображения здесь

Я интересно , если есть команда CMD , которая делает все это (используя find, for, powershell)

чтобы я мог получить имя процесса


netstat -b как администратор, например, netstat -abon. И имя exe ниже
barlop

Ответы:


56

Решение

Используйте -bпараметр:

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

Примечание . netstat -bКоманда не будет выполнена, если она не запущена из командной строки с повышенными правами.

Временное решение

Отфильтруйте список процессов и найдите интересующий вас PID:

tasklist | findstr /c:"PID"  


Альтернативное решение

Вы можете использовать Tcpvcon.exeвместо этого. Права администратора не требуются.

Использование Tcpvcon аналогично использованию встроенной netstatутилиты 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.

1
Ты мужчина.
Рой Намир

хороший ответ, просто комментируя, что я думаю, что это забавно, как мс /? в документации даже сказано "эта опция может занимать много времени"! и это просто глупость окон, что отнимает много времени. Netstat в Linux быстро отображает имя исполняемого файла. А также отображение исполняемого имени в linux не требует привилегий root / admin
barlop

8

Я думаю, что вы ищете TCPView от SysInternals.


Мне было интересно, если есть команда CMD, которая делает все это
Рой Намир

Продолжайте - Есть компонент командной строки TCPView ..
Leptonator

о хорошо подумал, может быть, кто-то уже сделал это, используя для, найти и т. д.
Рой Намир

Это не должно быть слишком сложно сделать. Могу поспорить , что на robvanderwoude.com что-то есть. На странице TCPView - «Загрузка TCPView включает Tcpvcon, версию командной строки с той же функциональностью».
Лептонатор

Очень хороший набор инструментов .. если бы не msys и sis, я бы использовал никс-бокс. :)
Eddie B

2

Вот пример для окон , используя FORдля разбора netstatвывода затем DO tasklistс /fiфильтром на PID , чтобы показать имя процесса.

Последняя находка - удалить tasklistзаголовки.

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

выводит записи записей как

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

Дополнительные поля из netstatможно добавить, добавив токены.


Плюсы этого решения, в том числе: 1. использование findдля фильтрации портов (в отличие от этого, хотя он netstat -bможет предоставить имя процесса напрямую, но просмотр его результатов для поиска вручную является болезненным и подвержен ошибкам); 2. использовать только собственные команды Windows, что более гибко и независимо.
Yingyu ВЫ

1
Возможные улучшения: 1. использовать findstrс /Rопцией вместо findиспользования регулярных выражений для лучшего поиска; 2. использовать :443 *[[0-9]"как шаблон для фильтрации только локального порта . Вся команда может быть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 или @mark Не могли бы вы уточнить «Дополнительные поля из netstatможно добавить, добавив токены.»?
Ив

2

Если вы любите использовать PS, вы можете раскошелиться на этот код (примечание: он супер базовый)

$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)"
}

Обратите внимание, что вы можете попытаться Pathвместо того, ProcessNameчтобы получить полный путь к исполняемому файлу - он не будет работать с системными службами. Кроме того, вы можете захотеть добавить ProcessNameк концу строки вместо замены значения PID.

Наслаждайся этим ;)


1

Попробуйте использовать это ...

Имя процесса с отметкой времени :) в oneliner ... нет необходимости быстро и легко писать сценарии ...

Вы можете изменить параметр SYN_SENT на ESTABLISHED или 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

Я использовал это с шаблоном на ip: port, который хотел наблюдать. Отличный фрагмент!
Алекс

0

Очень хороший Эрик Битемо! Я думал о добавлении переменной для пути, тогда я понял, что у вас уже есть это, хотя это не было определено. Итак, код, который я использовал повторно:

$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*"}
     }

Я пытался найти процессы и сервисы для приложения, где я использовал несколько другой 2-х слойный.

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

Я отредактировал вопрос Эрика, включив в него ваше исправление, поэтому, если хотите, вы можете удалить его из своего ответа и сосредоточиться на своем подходе с помощью GetServiceи Get-Process.
flolilo
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.