netstat: Veja o nome do processo como em 'ps aux'

6

O daemon postfix tem apenas o nome "master" se eu usar netsat assim:

root@myhost# netstat -tulpen| grep master
tcp  0  0 127.0.0.1:25  0.0.0.0:*  LISTEN  0  53191445 13640/master        

Se eu usar ps , recebo um nome mais detalhado:

root@myhost# ps aux| grep 13640
root     13640  0.0  0.0  25036  1500 11:35   0:00 /usr/lib/postfix/master

Existe uma maneira de informar netstat para a saída do nome longo?

Nesse caso, seria /usr/lib/postfix/master .

Atualizar

Parece que o netstat não pode fazer isso. Se você souber como fazer isso com outra ferramenta, essa também é uma questão válida. (Mas as soluções baseadas em netstat ainda são preferidas).

Update2

Todas as respostas funcionam. Muito obrigado por mostrar seu conhecimento unix. Mas até agora as respostas são longas demais / complicadas.

Não há solução fácil? Eu posso instalar qualquer ferramenta que seja necessária, mas eu quero que o uso seja simples de usar.

Eu não posso dar a recompensa para todos vocês ...

Existem várias respostas para postar o processamento para obter as informações necessárias. Cada resposta usa uma maneira diferente e não vejo que uma solução seja melhor que outra.

Infelizmente, parece não haver nenhum unix / linux que possa fazer isso da caixa. Mas isso não é culpa sua, que tentou me ajudar.

Infelizmente, não posso dar a recompensa a todas as respostas: -)

Eu dei a recompensa ao usuário com menos pontos de reputação.

    
por guettli 12.10.2016 / 11:41

5 respostas

3

Só para me divertir eu fiz isso:

sudo netstat -putan | awk '/master/ {out=""; for(i=1;i<=6;i++){out=out" "$i}; split($7,result,"/"); system("ps aux | grep -v grep | grep " result[1] " >> x&"); getline < "x"; print out " " $14}'

Eu acho que é o que você quer. Você sempre pode usá-lo como um alias para simplificar seu uso.

Explicação:

A próxima linha obtém a saída do netstat e filtra master

sudo netstat -putan | awk '/master/

A próxima linha armazena a saída do netstat.

out=""; for(i=1;i<=6;i++){out=out" "$i}

A próxima linha recebe o pid:

split($7,result,"/")

A próxima linha pega o nome completo do ps aux e imprime tudo

system("ps aux | grep -v grep | grep " result[1] " >> x&"); getline < "x"; 

Finalmente, é impresso:

print out " " $14
    
por 18.10.2016 / 15:24
3

Como você já imaginou, netstat , por padrão, não pode fornecer a opção cmdline total com -p . Como por fonte, parece limitado a 20 caracteres e apenas lista parte do cmdline completo

Você pode escrever seu próprio wrapper no netstat para exibir todos os detalhes. Adicionado abaixo trecho de código python que exibe a linha completa cmd.

#!/usr/bin/env python

from subprocess import Popen,PIPE

out,err = Popen(['netstat','-antlp'],stdout=PIPE).communicate()

for l in out.splitlines():
    line = l.split()
    if '/' in line[-1]:
        p = line[-1].split('/')[0]
        line[-1] = str(p) + ' -> ' + open('/proc/'+p+'/cmdline','r').readline().split('-')[0]
    print '\t'.join(line)

Exemplo de saída:

$ sudo ./netstat.py 
Active  Internet    connections (servers    and established)
Proto   Recv-Q  Send-Q  Local   Address Foreign Address State   PID/Program name
tcp 0   0   0.0.0.0:11443   0.0.0.0:*   LISTEN  4007 -> /usr/sbin/apache2
tcp 0   0   192.168.2.125:53    0.0.0.0:*   LISTEN  3055 -> /usr/sbin/named
tcp 0   0   172.17.0.1:53   0.0.0.0:*   LISTEN  3055 -> /usr/sbin/named
tcp 0   0   192.168.125.1:53    0.0.0.0:*   LISTEN  3055 -> /usr/sbin/named
tcp 0   0   192.168.0.200:53    0.0.0.0:*   LISTEN  3055 -> /usr/sbin/named
tcp 0   0   127.0.0.1:53    0.0.0.0:*   LISTEN  3055 -> /usr/sbin/named
tcp 0   0   0.0.0.0:22  0.0.0.0:*   LISTEN  3125 -> /usr/sbin/sshd
tcp 0   0   127.0.0.1:631   0.0.0.0:*   LISTEN  30845 -> /usr/sbin/cupsd
tcp 0   0   127.0.0.1:25    0.0.0.0:*   LISTEN  3884 -> /usr/sbin/exim4
tcp 0   0   127.0.0.1:953   0.0.0.0:*   LISTEN  3055 -> /usr/sbin/named
tcp 0   0   0.0.0.0:32765   0.0.0.0:*   LISTEN  3014 -> /sbin/rpc.statd
tcp 0   0   0.0.0.0:8895    0.0.0.0:*   LISTEN  4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0   0   0.0.0.0:23423   0.0.0.0:*   LISTEN  4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0   0   0.0.0.0:32767   0.0.0.0:*   LISTEN  3827 -> /usr/sbin/rpc.mountd
tcp 0   0   0.0.0.0:23424   0.0.0.0:*   LISTEN  4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0   0   0.0.0.0:32768   0.0.0.0:*   LISTEN  -
tcp 0   0   0.0.0.0:2049    0.0.0.0:*   LISTEN  -
tcp 0   0   0.0.0.0:23523   0.0.0.0:*   LISTEN  4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0   0   0.0.0.0:23524   0.0.0.0:*   LISTEN  4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0   0   192.168.0.200:44331 0.0.0.0:*   LISTEN  4078 -> /home/cv/jdk1.8.0_31/bin/java
tcp 0   0   0.0.0.0:111 0.0.0.0:*   LISTEN  3002 -> /sbin/rpcbind
tcp 0   0   0.0.0.0:8080    0.0.0.0:*   LISTEN  4007 -> /usr/sbin/apache2
tcp 0   0   0.0.0.0:6000    0.0.0.0:*   LISTEN  3908 -> /usr/bin/Xorg:0

Você pode escrever seu próprio wrapper em torno de linhas semelhantes e adicionar à sua caixa de ferramentas!

    
por 20.10.2016 / 17:38
1

Solução semelhante a @ iñaki-murillo mas usando /proc/pid/cmdline em vez de ps e grep . Eu também uso $NF e assumo que o último campo está no formato pid/procname , em vez de assumir que é $ 7 (na verdade, era $ 6 no meu sistema).

netstat -putan|awk '/master/ {split($NF, pid,"/");sub(FS $NF,x);getline cmd < ("/proc/"pid[1]"/cmdline");print $0" "pid[1]"/"cmd}'

Explicação

/master/ Filtro nas linhas que contêm o mestre.

split($NF, pid,"/"); Divida o último campo em / e armazene em pid

sub(FS $NF,x); Exclua o último campo.

getline cmd < ("/proc/"pid[1]"/cmdline") Leia a chamada da linha de comando do pid em questão e salve-a em cmd .

print $0" "pid[1]"/"cmd Imprima tudo

    
por 20.10.2016 / 21:22
1

Esta é a pesquisa mais interessante para uma solução "elegante" que tive em algum tempo. Obrigado.

Comentário geral:

Em vez de analisar /proc/pid/cmdline , faz muito mais sentido executar readlink /proc/pid/exe .

O que parece:

Eu configurei uma função do shell full para abstrair a complexidade - principalmente para economizar na digitação.

As únicas dependências são compatível com POSIX ex e padrão Linux readlink .

Na saída de terminal a seguir, canalizei head para brevidade.

[root@localhost ~]# netstat -tulpen | head
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       User       Inode      PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      0          9581       1237/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      0          10164      1493/master         
tcp        0      0 0.0.0.0:555                 0.0.0.0:*                   LISTEN      0          14326      2824/nc             
tcp        0      0 0.0.0.0:46638               0.0.0.0:*                   LISTEN      29         8848       960/rpc.statd       
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      0          8749       940/rpcbind         
tcp        0      0 :::22                       :::*                        LISTEN      0          9583       1237/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      0          10166      1493/master         
tcp        0      0 :::47166                    :::*                        LISTEN      29         8856       960/rpc.statd       
[root@localhost ~]# netstat -tulpen | head | full
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       User       Inode      PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      0          9581       1237/usr/sbin/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      0          10164      1493/usr/libexec/postfix/master         
tcp        0      0 0.0.0.0:555                 0.0.0.0:*                   LISTEN      0          14326      2824/usr/bin/nc             
tcp        0      0 0.0.0.0:46638               0.0.0.0:*                   LISTEN      29         8848       960/sbin/rpc.statd       
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      0          8749       940/sbin/rpcbind         
tcp        0      0 :::22                       :::*                        LISTEN      0          9583       1237/usr/sbin/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      0          10166      1493/usr/libexec/postfix/master         
tcp        0      0 :::47166                    :::*                        LISTEN      29         8856       960/sbin/rpc.statd       
[root@localhost ~]# 

Ele também funciona com qualquer forma de netstat -p , mesmo os formulários que possuem outros dados finais em algumas linhas:

[root@localhost ~]# netstat -p | head
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 10.0.2.15:ssh               10.0.2.2:63550              ESTABLISHED 2557/sshd           
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  11     [ ]         DGRAM                    8584   895/rsyslogd        /dev/log
unix  2      [ ]         DGRAM                    9124   1045/hald           @/org/freedesktop/hal/udev_event
unix  2      [ ]         DGRAM                    7116   340/udevd           @/org/kernel/udev/udevd
unix  2      [ ]         DGRAM                    16523  3537/pickup         
unix  2      [ ]         DGRAM                    15036  2865/su             
[root@localhost ~]# netstat -p | head | full
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 10.0.2.15:ssh               10.0.2.2:63550              ESTABLISHED 2557/usr/sbin/sshd           
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node PID/Program name    Path
unix  11     [ ]         DGRAM                    8584   895/sbin/rsyslogd        /dev/log
unix  2      [ ]         DGRAM                    9124   1045/usr/sbin/hald           @/org/freedesktop/hal/udev_event
unix  2      [ ]         DGRAM                    7116   340/sbin/udevd           @/org/kernel/udev/udevd
unix  2      [ ]         DGRAM                    16523  3537/usr/libexec/postfix/pickup         
unix  2      [ ]         DGRAM                    15036  2865/bin/su             
[root@localhost ~]# 

Como é definido:

[root@localhost ~]# type full
full is a function
full () 
{ 
    ex -c 'g/^.*\(\<[0-9]\+\)\/.*$/ya|pu|s::readlink /proc//exe:|.!sh' -c 'g/^\//-ya|pu|-2s/^\(.*\<[0-9]\+\)\/[^[:space:]]*\(.*\)$//|+2s///|-2j!3' -c%p -c 'q!' /dev/stdin
}
[root@localhost ~]# 

Como funciona (detalhamento passo a passo):

(Forthcoming; enquanto isso, experimente e deixe-me saber como você gosta.)

    
por 21.10.2016 / 22:19
0

com xargs & readlink :

$ netstat -tulpen \
    | grep chrome \
    | xargs -L1 bash -c 'echo $@ $(readlink /proc/${7//[A-Z\/]/}/exe)'
0 0 0.0.0.0:5353 0.0.0.0:* 1000 17007 2521/chrome /opt/google/chrome/chrome
    
por 21.10.2016 / 22:58

Tags