Leggi "/ proc" per sapere se un processo ha aperto una porta


13

Devo sapere se un processo con un determinato PID ha aperto una porta senza usare comandi esterni. Devo quindi usare il /procfilesystem. Posso leggere il /proc/$PID/net/tcpfile per esempio e ottenere informazioni sulle porte TCP aperte dal processo. Tuttavia, su un processo multithread, la /proc/$PID/task/$TIDdirectory conterrà anche un net/tcpfile. La mia domanda è :

devo andare su tutti i net/tcpfile dei thread o la porta aperta dai thread verrà scritta nel net/tcpfile di processo ?

Risposte:


23

Posso leggere il file / proc / $ PID / net / tcp per esempio e ottenere informazioni sulle porte TCP aperte dal processo.

Quel file non è un elenco di porte tcp aperte dal processo . È un elenco di tutte le porte tcp aperte nello spazio dei nomi di rete corrente e per i processi in esecuzione nello stesso spazio dei nomi di rete è identico al contenuto di /proc/net/tcp.

Per trovare le porte aperte dal processo, è necessario ottenere un elenco di descrittori socket da /proc/<pid>/fd, quindi abbinare tali descrittori al inodecampo di /proc/net/tcp.


La ringrazio per la risposta. E se il processo è multithread, devo andare su tutta la fddirectory di ogni thread? O la /proc/pid/fddirectory "eredita" le /proc/pid/task/tid/fddirectory?
rmonjo,

Non ne sono sicuro, ma sembra una cosa facile da testare.
Larks

7
@rmonjo I thread non possono aprire i file, solo i processi possono. La fddirectory di un thread ripete semplicemente la fddirectory del processo.
Gilles 'SO- smetti di essere malvagio' il

0

per favore

cat /proc/$PID/net/tcp

e otterrai un output in questo modo

  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 seconda colonna (local_address) dell'output mostra la porta in esadecimale. Usa il tuo calcolatore di programmazione per convertire il codice esadecimale in decimale.

Ad esempio qui, la porta: 01BB (in esadecimale) è uguale a 433 (in decimale) che è la porta predefinita HTTPS.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.