GNU/Linux >> Belajar Linux >  >> Linux

API Linux untuk menentukan soket yang dimiliki oleh suatu proses

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

Linux
  1. Cara menginstal vtop di Linux

  2. Linux – Proses “subreaper”?

  3. Proses Boot Linux

  1. Cara Menentukan Proses Yang Menulis ke Disk di Linux

  2. Proses Pembuatan Linux?

  3. Membuat daemon di Linux

  1. Linux – Blokir Akses Jaringan Suatu Proses?

  2. Pengantar Utas Linux – Bagian I

  3. Bagaimana saya bisa menentukan proses apa yang membuka file di Linux?