Lea "/ proc" para saber si un proceso ha abierto un puerto

13

Necesito saber si un proceso con un PID dado abrió un puerto sin usar comandos externos. Entonces debo usar el /procsistema de archivos. Puedo leer el /proc/$PID/net/tcparchivo, por ejemplo, y obtener información sobre los puertos TCP abiertos por el proceso. Sin embargo, en un proceso multiproceso, el /proc/$PID/task/$TIDdirectorio también contendrá un net/tcparchivo. Mi pregunta es :

¿Necesito revisar todos los net/tcparchivos de subprocesos o el puerto abierto por subprocesos se escribirá en el net/tcparchivo de proceso ?

rmonjo
fuente

Respuestas:

23

Puedo leer el archivo / proc / $ PID / net / tcp, por ejemplo, y obtener información sobre los puertos TCP abiertos por el proceso.

Ese archivo no es una lista de puertos TCP abiertos por el proceso . Es una lista de todos los puertos TCP abiertos en el espacio de nombres de red actual, y para los procesos que se ejecutan en el mismo espacio de nombres de red es idéntico al contenido de /proc/net/tcp.

Para encontrar los puertos abiertos por su proceso, necesitaría obtener una lista de descriptores de socket /proc/<pid>/fdy luego hacer coincidir esos descriptores con el inodecampo de /proc/net/tcp.

larsks
fuente
Gracias por su respuesta. Y si el proceso es multiproceso, ¿debo revisar todo el fddirectorio de cada subproceso? ¿O el /proc/pid/fddirectorio "hereda" los /proc/pid/task/tid/fddirectorios?
rmonjo
No estoy seguro, pero eso parece algo fácil de probar.
larsks
77
@rmonjo Los hilos no pueden abrir archivos, solo los procesos pueden. El fddirectorio de un hilo simplemente repite el fddirectorio del proceso.
Gilles 'SO- deja de ser malvado'
0

Por favor

cat /proc/$PID/net/tcp

y obtendrás resultados como este

  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
  0: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 2891985097 1 0000000000000000 100 0 0 10 0

La segunda columna (local_address) de la salida muestra el puerto en hexadecimal. Use su calculadora de programación para convertir el código hexadecimal a decimal.

Por ejemplo, aquí, el puerto: 01BB (en hexadecimal) es igual a 433 (en decimal), que es el puerto predeterminado HTTPS.

PHZ.fi-Pharazon
fuente