SIN usar líneas de comando de red en Linux, ¿cómo saber la lista de puertos abiertos y el proceso que los posee?

11

Quiero saber qué puertos utilizan los procesos en Linux incorporado. Como es simple embedded-linux, no hay líneas de comando de red como netstat, lsof. (solo existen líneas de comando básicas como cat, cp, echo, etc.).

Una solución parcial parece ser usar las líneas de comando "cat / proc / net / tcp" y "cat / proc / net / udp". Sin embargo, no estoy seguro de que la lista impresa de esas líneas de comando muestre todos los puertos en uso , y la lista no muestra qué proceso está vinculado a cierto puerto .

Cualquier comentario será bienvenido.

freddy
fuente
Creo que esta pregunta es más adecuada para Unix y Linux

Respuestas:

15

Debería poder encontrar todos los puertos abiertos en /proc/net/tcpy /proc/net/udp. Cada uno de esos archivos tiene una inodecolumna, que se puede utilizar para encontrar el proceso que posee ese socket.

Una vez que tenga un número de inodo, puede ejecutar un comando ls como ls -l /proc/*/fd/* | grep socket:.$INODEpara encontrar los procesos utilizando ese socket. En caso de que se haya configurado un proceso con diferentes descriptores de archivo para diferentes subprocesos, es posible que deba extender el comando ls -l /proc/*/task/*/fd/* | grep socket:.$INODEpara encontrarlos a todos.

kasperd
fuente
1
find /proc -lname "socket:\[$INODE\]" 2> /dev/null
Sammitch
0

Para encontrar los INODOS para cualquier puerto, ejecute el siguiente comando

PORT=8080;cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | awk -F ":" '{print "PORT=" $2 ", INODE=" $3 }'

Use cualquier INODE de la salida del comando anterior para encontrar el PID asociado como se muestra a continuación

find /proc -lname "socket:\[$INODE\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'

aquí $ INODE es el valor de cualquier INODE

En un comando de una sola línea, podemos verificar si algún puerto está abierto y asociado a algún PID como se muestra a continuación

PORT=8080;find /proc -lname "socket:\[$(cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | head -n 1 | awk -F ":" '{print $3}')\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'
Anil Agrawal
fuente