netstat з назвою процесу?


46

Використовуючи, netstat -a -o -n я можу отримати список портів та PID

тоді мені потрібно зайти до менеджера завдань і додати PID і подивитися, хто це. (досить розчаровує)

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

Я цікаво , якщо є команда CMD , яка робить все це (використовуючи find, for, powershell)

щоб я міг отримати ім'я процесу


netstat -b як адміністратор, наприклад netstat -abon. А назва exe внизу
барлоп

Відповіді:


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
ти людина.
Royi Namir

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

8

Я думаю, ви шукаєте TCPView від SysInternals.


Мені було цікаво, чи є команда CMD, яка все робить
Рой Намір

Продовжуйте - Є компонент командного рядка TCPView ..
Leptonator

о, добре. думав, може, хтось уже це зробив, використовуючи, знайдіть і т. д.
Рой Намір

Це не повинно бути занадто важким. Я б став би на robvanderwoude.com, що є на цьому. На сторінці TCPView - "Завантаження TCPView включає Tcpvcon, версію командного рядка з тією ж функціональністю."
Лептонатор

Дуже хороший набір інструментів .. якби не msys та sis, я б використовував nix box. :)
Едді Б

2

Ось приклад для Windows, які використовують 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: порту, який я хотів спостерігати. Чудовий фрагмент!
Олексій

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.