Baca “/ proc” untuk mengetahui apakah suatu proses telah membuka port

13

Saya perlu tahu apakah suatu proses dengan PID yang diberikan sebagai membuka port tanpa menggunakan perintah eksternal. Saya kemudian harus menggunakan sistem /procfile. Saya dapat membaca /proc/$PID/net/tcpfile misalnya dan mendapatkan informasi tentang port TCP yang dibuka oleh proses. Namun, pada proses multithreaded, /proc/$PID/task/$TIDdirektori juga akan berisi net/tcpfile. Pertanyaanku adalah :

apakah saya perlu memeriksa semua net/tcpfile utas , atau apakah port yang dibuka oleh utas akan ditulis ke dalam net/tcpfile proses .

rmonjo
sumber

Jawaban:

23

Saya dapat membaca file / proc / $ PID / net / tcp misalnya dan mendapatkan informasi tentang port TCP yang dibuka oleh proses.

File itu bukan daftar port tcp yang dibuka oleh proses . Ini adalah daftar semua port tcp terbuka di namespace jaringan saat ini, dan untuk proses yang berjalan di namespace jaringan yang sama identik dengan konten /proc/net/tcp.

Untuk menemukan port yang dibuka oleh proses Anda, Anda harus mendapatkan daftar deskriptor soket dari /proc/<pid>/fd, dan kemudian mencocokkan deskriptor tersebut dengan inodebidang /proc/net/tcp.

larsks
sumber
Terima kasih atas jawaban Anda. Dan jika prosesnya multithreaded, apakah saya perlu memeriksa semua fddirektori dari setiap thread? Atau apakah /proc/pid/fddirektori "mewarisi" /proc/pid/task/tid/fddirektori?
rmonjo
Saya tidak yakin, tapi sepertinya itu hal yang mudah untuk diuji.
larsks
7
@rmonjo Utas tidak dapat membuka file, hanya proses yang bisa. The fddirektori thread hanya mengulangi fddirektori proses.
Gilles 'SANGAT berhenti menjadi jahat'
0

Silahkan

cat /proc/$PID/net/tcp

dan Anda akan mendapatkan output seperti ini

  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

Kolom kedua (local_address) dari output menunjukkan port dalam Hexadecimal. Gunakan Kalkulator Pemrograman Anda untuk mengonversi kode heks menjadi desimal.

Misalnya di sini, port: 01BB (dalam hex) sama dengan 433 (dalam desimal) yang merupakan port default HTTPS.

PHZ.fi-Pharazon
sumber