netstat: ver el nombre del process como en `ps aux`

El daemon postfix solo tiene el nombre "maestro" si utilizo netsat esta manera:

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

Si uso ps obtengo un nombre más detallado:

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

¿Hay alguna manera de decirle a netstat que netstat el nombre largo?

En este caso, sería /usr/lib/postfix/master .

Actualizar

Parece que netstat no puede hacerlo. Si sabe cómo hacer esto con otra herramienta, esta también es una pregunta válida. (Pero las soluciones basadas en netstat son aún preferidas).

Actualización2

Todas las respuestas funcionan Muchas gracias por mostrar tu conocimiento de Unix. Pero hasta ahora las respuestas son demasiado largas / complicadas.

¿No hay una solución fácil? Puedo instalar cualquier herramienta que sea necesaria, pero quiero que el uso sea simple de usar.

No les puedo dar la recompensa a todos ustedes …

Hay varias respuestas para publicar el procesamiento para get la información necesaria. Cada respuesta utiliza una forma diferente y no veo que una solución sea mejor que otra.

Desafortunadamente, parece que no hay unix / linux que pueda hacer esto de la caja. Pero eso no fue culpa tuya, que intentó ayudarme.

Lamentablemente, no puedo dar la recompensa a todas las respuestas 🙂

Le di la recompensa al usuario con less puntos de reputación.

Para divertirme, hice esto:

 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}' 

Creo que es lo que quieres Siempre puede usarlo como un alias, para simplificar su uso.

Explicación:

La siguiente línea obtiene la salida de netstat y filtra master

 sudo netstat -putan | awk '/master/ 

La siguiente línea almacena la salida de netstat.

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

La siguiente línea obtiene el pid:

 split($7,result,"/") 

La siguiente línea recibe el nombre completo de ps aux e imprime todo

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

Finalmente se imprime:

 print out " " $14 

Como ya se ha calculado netstat de forma pnetworkingeterminada, no puede proporcionar una salida completa de cmdline con la opción -p . Según la fuente, parece limitarse a 20 caracteres y solo muestra una parte de la línea completa de cm.

Podrías escribir tu propio envoltorio alnetworkingedor de netstat para mostrar detalles completos. Se agregó un fragment de código python que muestra una línea completa de 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) 

Muestra de salida:

 $ 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 

¡Podrías escribir tu propio envoltorio alnetworkingedor de líneas similares y agregarlo a tu caja de herramientas!

Solución similar a @ iñaki-murillo pero usando /proc/pid/cmdline lugar de ps y grep . También uso $NF y supongo que el último campo está en formatting pid/procname lugar de asumir que es $ 7 (en realidad era $ 6 en mi sistema).

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

Explicación

/master/ Filtrar en líneas que contienen el maestro.

split($NF, pid,"/"); Dividir el último campo en / y almacenar en pid

sub(FS $NF,x); Eliminar el último campo

getline cmd < ("/proc/"pid[1]"/cmdline") Lee la llamada de línea de command del pid en cuestión y getline cmd < ("/proc/"pid[1]"/cmdline") en cmd .

print $0" "pid[1]"/"cmd Imprimirlo todo

Esta es la búsqueda más interesante de una solución "elegante" que he tenido en algún momento. Gracias.

Comentario general:

En lugar de analizar /proc/pid/cmdline , tiene mucho más sentido ejecutar readlink /proc/pid/exe lugar.

Como se ve:

Configuré una function de shell full para abstraer la complejidad de esto, principalmente solo para ahorrar en tipeo.

Las únicas dependencies son POSIX-obediente y el readlink estándar de Linux.

En la siguiente salida de terminal, he canalizado a través de la head para abreviar.

 [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 ~]# 

También funciona con cualquier forma de netstat -p , incluso los formularios que tienen otros datos finales en algunas líneas:

 [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 ~]# 

Cómo se define:

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

Cómo funciona (desglose paso a paso):

(Próximamente, mientras tanto pruébalo y cuéntame cómo te gusta).

Con xargs y readlink :

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