Untuk menentukan soket yang dimiliki oleh suatu proses, Anda cukup menggunakan netstat
. Berikut adalah contoh w/output (disingkat) dari netstat
dengan opsi yang akan melakukan apa yang Anda inginkan.
$ sudo netstat -apeen
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State User Inode PID/Program name
tcp 0 0 127.0.0.1:8118 0.0.0.0:* LISTEN 138 744850 13248/privoxy
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 117 9612 2019/postgres
udp 0 0 127.0.0.1:51960 127.0.0.1:51960 ESTABLISHED 117 7957 2019/postgres
udp 0 0 0.0.0.0:68 0.0.0.0:* 0 7740 1989/dhclient
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 7937 2019/postgres /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 958058 8080/emacs /tmp/emacs1000/server
unix 2 [ ACC ] STREAM LISTENING 6969 1625/Xorg /tmp/.X11-unix/X0
unix 2 [ ] DGRAM 9325 1989/dhclient
unix 3 [ ] STREAM CONNECTED 7720 1625/Xorg @/tmp/.X11-unix/X0
Pastikan Anda menjalankan netstat sebagai root jika tidak, Anda akan mendapatkan pesan ini:
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Penjelasan tentang -apeen
opsi dari halaman manual netstat:
-a, --all
Show both listening and non-listening sockets. With the
--interfaces option, show interfaces that are not up
-p, --program
Show the PID and name of the program to which each socket
belongs.
-e, --extend
Display additional information. Use this option twice for
maximum detail.
--numeric , -n
Show numerical addresses instead of trying to determine symbolic host, port or user names.
--numeric-hosts
shows numerical host addresses but does not affect the resolution of port or user names.
--numeric-ports
shows numerical port numbers but does not affect the resolution of host or user names.
--numeric-users
shows numerical user IDs but does not affect the resolution of host or port names.
Saya pikir Anda pertama-tama harus melihat melalui fds terbuka di /proc/*/fd, mis.
4 -> socket:[11147]
lalu cari soket yang direferensikan (berdasarkan inode) di /proc/net/tcp (atau /proc/net/udp), mis.
12: B382595D:8B40 D5C43B45:0050 01 00000000:00000000 00:00000000 00000000 1000 0 11065 1 ffff88008bd35480 69 4 12 4 -1
/proc
filesystem memberikan detail pada setiap proses, termasuk informasi jaringan. Informasi soket terbuka tercantum dalam /proc/net/tcp
. Soket IPv6 dicantumkan secara terpisah di tcp6
mengajukan. Informasi soket mencakup informasi seperti port lokal dan jarak jauh, dan nomor inode soket, yang dapat dipetakan kembali ke proses dengan mem-parsing /proc/{pid}/fd/*
informasi.
Jika Anda tidak terbiasa dengan /proc
filesystem, ini pada dasarnya adalah filesystem virtual yang memungkinkan kernel untuk mempublikasikan segala macam informasi berguna ke ruang pengguna. File tersebut biasanya berupa file teks terstruktur sederhana yang mudah diuraikan.
Misalnya, pada sistem Ubuntu saya menggunakan netcat
untuk pengujian, dan menjalankan nc -l -p 8321
untuk mendengarkan pada port 8321. Melihat tcp
informasi soket:
$ cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:2081 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 26442 1 de0c8e40 300 0 0 2 -1
1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7019 1 de0c84c0 300 0 0 2 -1
Baris pertama menunjukkan sedang mendengarkan semua alamat ke titik 8321 (0x2081). Nomor inode adalah 26442, yang dapat kita gunakan untuk mencari pid yang cocok di /proc/{pid}/fd/*
, yang terdiri dari sekumpulan symlink dari nomor pegangan file ke perangkat. Jadi jika kita mencari pid untuk netcat
, dan periksa fd
nya pemetaan:
$ ls -l /proc/7266/fd
total 0
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 0 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 1 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 2 -> /dev/pts/1
lrwx------ 1 gavinb gavinb 64 2009-12-31 09:10 3 -> socket:[26442]
Dan di sana kita melihat bahwa deskriptor file 3 dalam proses ini dipetakan ke soket dengan inode 26442, seperti yang kita harapkan.
Jadi jelas untuk membangun peta soket yang lengkap, Anda harus terlebih dahulu menghitung semua /proc/**/fd/*
file, cari symlink soket, lalu cocokkan soket inode dengan tabel dari /proc/net/tcp
yang memiliki informasi titik akhir.
Ini adalah cara lsof
alat berfungsi (lihat lsof/dialects/linux/dsocket.c
untuk implementasi).
- Wikipedia tentang procfs
- Sistem file Linux /proc sebagai Alat Programmer