netstat com nome do processo?


46

Usando netstat -a -o -n posso obter a lista de portas e PID

então eu preciso ir ao gerenciador de tarefas e adicionar o PID e ver quem é. (bastante frustrante)

insira a descrição da imagem aqui

Eu estava me pergunto se existe um comando CMD que faz tudo isso (usando find, for, powershell)

para que eu pudesse obter o nome do processo


netstat -b como administrador, por exemplo, netstat -abon. E o nome do exe está abaixo
barlop 13/05

Respostas:


56

Solução

Use o -bparâmetro:

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

Nota O netstat -bcomando falhará, a menos que seja executado em um prompt de comando elevado.

Gambiarra

Filtre a lista de processos e encontre o PID do seu interesse:

tasklist | findstr /c:"PID"  


Solução alternativa

Você pode usar em seu Tcpvcon.exelugar. Não são necessários direitos de administrador.

O uso do tcpvcon é semelhante ao do netstatutilitário interno do 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
você é o cara.
Royi Namir

boa resposta, apenas comentando que acho divertido como o ms /? a documentação até diz "essa opção pode ser demorada"! e é puramente uma estupidez de janelas que consome tempo. O netstat do Linux mostra seu nome executável rapidamente. E também o nome do executável que mostra o linux não requer raiz privilégios / admin
barlop

8

Eu acho que você está procurando o TCPView da SysInternals.


Fiquei me perguntando se existe um comando CMD que faz tudo isso
Royi Namir

Continue indo - Há um componente de linha de comando do TCPView ..
Leptonator

Ah ok. pensei que talvez alguém já fez isso usando, encontrar etc.
Royi Namir

Não deve ser muito difícil de fazer. Aposto que robvanderwoude.com tem algo a ver. Pela página TCPView - "O download do TCPView inclui Tcpvcon, uma versão da linha de comandos com a mesma funcionalidade."
precisa saber é o seguinte

Muito bom conjunto de ferramentas ... se não fosse por ms e sis, eu estaria usando uma caixa nix. :)
Eddie B

2

Aqui está um exemplo para o Windows usando FORpara analisar a netstatsaída e, DO tasklistem seguida, com o /fifiltro on pid para mostrar o nome do processo.

A última descoberta é remover os tasklistcabeçalhos.

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

imprime registros de saída como

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

Campos adicionais de netstatpodem ser adicionados adicionando tokens.


Prós desta solução, incluindo: 1. usar findpara filtrar portas (por outro lado, embora netstat -bpossa fornecer o nome do processo diretamente, mas passar pela saída para pesquisar manualmente é doloroso e propenso a erros); 2. usando apenas comandos nativos do Windows, que são mais flexíveis e independentes.
Yingyu YOU

1
Possível melhoria: 1. usar findstrcom /Ropção em vez de findutilizar regex para uma melhor pesquisa; 2. para usar :443 *[[0-9]"como padrão para filtrar apenas a porta local . O comando todo poderia serFOR /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 ou @mark Você poderia esclarecer "É possível adicionar campos adicionais a partir netstatda adição de tokens".
Yves Schelpe

2

Se você gosta de usar o PS, pode bifurcar esse código (nota: é super básico)

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

Observe que você pode tentar, em Pathvez de ProcessNameobter um caminho executável completo - embora não funcione com os serviços do sistema. Além disso, você pode anexar o ProcessNamefinal da linha em vez de substituir o valor do PID.

Aproveite ;)


1

Tente usar isso ...

Nome do processo com registro de data e hora :) no oneliner ... não é necessário criar scripts rápido e fácil ...

Você pode alterar o parâmetro SYN_SENT por ESTABLISHED ou 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

Eu usei isso com um padrão no ip: port que eu queria observar. Ótimo trecho!
Alex

0

Muito bom Erik Bitemo! Eu estava pensando em adicionar uma variável para o caminho, então percebi que você já o possui, embora não tenha sido definido. Portanto, o código que reutilizei foi:

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

Eu estava tentando encontrar os processos e serviços para um aplicativo em que usei um liner 2 um tanto diferente.

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

Eu editei a pergunta de Erik para incluir sua correção, portanto, se desejar, você pode excluí-la da sua resposta e concentrar-se na sua abordagem com GetServicee Get-Process.
Flolilo 7/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.