¿Enumerar los puertos que escucha un PID de proceso (preferiblemente usando herramientas iproute2)?

68

Estoy buscando enumerar todos los puertos en los que un PID está escuchando actualmente.

¿Cómo recomendaría que obtenga este tipo de datos sobre un proceso?

ThorSummoner
fuente
Lo suficientemente extraño ssno tiene filtrado en PID, excepto para los sockets de netlink.
Poige

Respuestas:

56

Puede usar ssdesde el paquete iproute2 (que es similar a netstat):

ss -l -p -n | grep "pid=1234,"

o (para versiones anteriores de iproute2):

ss -l -p -n | grep ",1234,"

Reemplace 1234 con el PID del programa.

jofel
fuente
3
También existe -uo solo -tpara udb o tcp. : +1: Y todo esto se puede apilar de esta manera:, ss -tlnpy para eliminar la salida de ancho de relleno, lo que me parece molesto , puede canalizar a través de cat o menos o w / e:ss -tlnp | cat
ThorSummoner
1
Me he acostumbrado ss -nlp | cat, eso es más o menos, muéstrame los procesos de escucha (-l), sus números de puerto (-n) y su información de proceso (-p), y no intentes ajustar la salida a mi shell | cat( o menos o lo que sea). Solo me tomó dos años acostumbrarme a eso: D
ThorSummoner
No funcionó para mí (en Debian 9). Hay que buscar grep para ", pid = 1234,"
ofrommel el
@ofrommel gracias por la pista: adapté la respuesta.
jofel
Además, esto solo funciona con permisos de root :)
ofrommel
57

No conozco una forma de usar iproute2herramientas. Pero como solución alternativa, puedes probar este.

lsof -Pan -p PID -i

debería darle la información que está buscando.


Salida

lsof -Pan -p 27808 -i
COMMAND   PID   USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
httpd   27808 apache    5u  IPv6 112811294      0t0  TCP *:80 (LISTEN)
httpd   27808 apache    7u  IPv6 112811298      0t0  TCP *:8443 (LISTEN)
httpd   27808 apache    9u  IPv6 112811303      0t0  TCP *:443 (LISTEN)

Obtuve este comando desde aquí, pero no estoy seguro del enlace exacto, ya que todos los anoté en el cuaderno. Pero también puedes echar un vistazo desde allí.

Ramesh
fuente
13

Puede usar netstatesto para descubrir el pid de cada proceso de escucha.

netstat: imprime conexiones de red, tablas de enrutamiento, estadísticas de interfaz, conexiones enmascaradas y membresías de multidifusión

-a, --todos muestran tomas de escucha y no escucha (para TCP, esto significa conexiones establecidas). Con la opción --interfaces, muestra las interfaces que no están marcadas

--numeric, -n Muestra direcciones numéricas en lugar de intentar determinar nombres de host, puerto o usuario simbólicos.

-p, --program Muestra el PID y el nombre del programa al que pertenece cada socket.

Aquí hay un ejemplo:

# netstat -anp
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:111                 0.0.0.0:*                   LISTEN      1507/rpcbind
tcp        0      0 0.0.0.0:51188               0.0.0.0:*                   LISTEN      1651/rpc.statd
tcp        0      0 0.0.0.0:1013                0.0.0.0:*                   LISTEN      1680/ypbind
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1975/sshd
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1763/cupsd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      2081/master
tcp        0      0 127.0.0.1:27017             0.0.0.0:*                   LISTEN      2119/mongod
tcp        0     48 172.16.33.73:22             172.16.127.110:51850        ESTABLISHED 25473/sshd
tcp        0      0 172.16.33.73:22             172.16.127.110:51214        ESTABLISHED 24699/sshd
tcp        0      0 :::111                      :::*                        LISTEN      1507/rpcbind
tcp        0      0 :::9200                     :::*                        LISTEN      1994/java
tcp        0      0 :::9300                     :::*                        LISTEN      1994/java
tcp        0      0 :::22                       :::*                        LISTEN      1975/sshd
tcp        0      0 ::1:631                     :::*                        LISTEN      1763/cupsd
tcp        0      0 ::1:25                      :::*                        LISTEN      2081/master
tcp        0      0 :::59162                    :::*                        LISTEN      1651/rpc.statd
Raza
fuente
1
Gracias, aunque he sido informado de que las netstatherramientas iproute2 han dejado de usarlo y estoy tratando de evitarlo.
ThorSummoner
12

La respuesta de @ jofel le muestra la herramienta adecuada para usar ss, aquí están los reemplazos para las otras herramientas de red en iproute2.

Los comandos en desuso y sus equivalentes iproute2 son los siguientes:

deprecated      replacement(s)
==========      ==============
- arp           ip n (ip neighbor)
- ifconfig      ip a (ip addr), ip link, ip -s (ip -stats)
- iptunnel      ip tunnel
- iwconfig      iw
- nameif        ip link, ifrename
- netstat       ss, ip route (for netstat-r), ip -s link (for netstat -i), 
                ip maddr (for netstat-g)

- route         ip r (ip route)

La lista básica también está aquí en Wikipedia: http://en.wikipedia.org/wiki/Iproute2 .

Referencias

slm
fuente
1

Otro método para lsofsi no conoce el PID, pero solo el nombre del Programa:

lsof -Pa -p $(pgrep [programName]) -i
cryptoboy
fuente
no funciona con lsof4.89 en ubuntu 16.04
palik
1
Ese será el caso si el programa ha generado múltiples procesos. En ese caso, deberá especificar el PID específico al ejecutar el comando lsof que le di. pgrep <program name>luego elija el PID que necesita para el comando anterior. reemplazando $(pgrep [programName])con el PID #
cryptoboy
0

¿Has probado, esto también hace lo mismo

netstat -plnt | grep 27071

éxito

El exorcista
fuente