Leia “/ proc” para saber se um processo abriu uma porta

13

Preciso saber se um processo com um determinado PID abriu uma porta sem usar comandos externos. Devo então usar o /procsistema de arquivos. Eu posso ler o /proc/$PID/net/tcparquivo, por exemplo, e obter informações sobre as portas TCP abertas pelo processo. No entanto, em um processo multithread, o /proc/$PID/task/$TIDdiretório também conterá um net/tcparquivo. Minha pergunta é :

Preciso examinar todos os net/tcparquivos de threads ou a porta aberta pelos threads será gravada no net/tcparquivo de processo .

rmonjo
fonte

Respostas:

23

Eu posso ler o arquivo / proc / $ PID / net / tcp, por exemplo, e obter informações sobre as portas TCP abertas pelo processo.

Esse arquivo não é uma lista de portas TCP abertas pelo processo . É uma lista de todas as portas TCP abertas no namespace de rede atual e, para processos em execução no mesmo namespace de rede, é idêntico ao conteúdo de /proc/net/tcp.

Para encontrar portas abertas pelo seu processo, você precisará obter uma lista de descritores de soquete /proc/<pid>/fde, em seguida, corresponder esses descritores ao inodecampo de /proc/net/tcp.

larsks
fonte
Obrigado pela sua resposta. E se o processo for multithread, preciso revisar todo o fddiretório de cada thread? Ou o /proc/pid/fddiretório "herda" os /proc/pid/task/tid/fddiretórios?
Rmonjo 29/08/2015
Não tenho certeza, mas isso parece fácil de testar.
Larsks
7
@rmonjo Threads não podem abrir arquivos, apenas processos. O fddiretório de um thread apenas repete o fddiretório do processo.
Gilles 'SO- stop be evil'
0

Por favor

cat /proc/$PID/net/tcp

e você terá uma saída como esta

  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

A segunda coluna (endereço_ local) da saída mostra a porta em hexadecimal. Use sua calculadora de programação para converter o código hexadecimal em decimal.

Por exemplo, aqui, a porta: 01BB (em hexadecimal) é igual a 433 (em decimal), que é a porta padrão HTTPS.

PHZ.fi-Pharazon
fonte