GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana menemukan ujung lain dari koneksi soket unix?

Solusi 1:

Jawaban ini hanya untuk Linux.

Pembaruan untuk Linux 3.3: Seperti yang ditulis Zulakis dalam jawaban terpisah (+1 itu), Anda dapat menggunakan ss dari iproute2 untuk mendapatkan sepasang nomor inode untuk setiap koneksi soket yang mengidentifikasi ujung dan rekan lokal. Ini tampaknya didasarkan pada mesin yang sama dengan sock_diag(7) dengan UNIX_DIAG_PEER atribut mengidentifikasi peer. Jawaban oleh Totor di Unix &Linux Stack Exchange menautkan ke komit yang relevan di kernel dan iproute2 dan juga menyebutkan perlunya UNIX_DIAG pengaturan konfigurasi kernel.

Jawaban asli untuk Linux pra 3.3 berikut.

Berdasarkan jawaban dari Unix &Linux Stack Exchange, saya berhasil mengidentifikasi ujung lain dari soket domain unix menggunakan struktur data dalam kernel, diakses menggunakan gdb dan /proc/kcore . Anda harus mengaktifkan CONFIG_DEBUG_INFO dan CONFIG_PROC_KCORE opsi kernel.

Anda dapat menggunakan lsof untuk mendapatkan alamat kernel dari soket, yang berbentuk penunjuk, mis. 0xffff8803e256d9c0 . Nomor tersebut sebenarnya adalah alamat dari struktur memori dalam kernel yang relevan atau ketik struct unix_sock . Struktur itu memiliki bidang yang disebut peer yang menunjuk ke ujung soket yang lain. Jadi perintahnya

# gdb /usr/src/linux/vmlinux /proc/kcore
(gdb) p ((struct unix_sock*)0xffff8803e256d9c0)->peer

akan mencetak alamat ujung koneksi yang lain. Anda dapat mengambil output dari lsof -U untuk nomor itu untuk mengidentifikasi proses dan nomor deskriptor file dari ujung lainnya.

Beberapa distribusi tampaknya menyediakan simbol debug kernel sebagai paket terpisah, yang akan menggantikan vmlinux file dalam perintah di atas.

Solusi 2:

Baru-baru ini saya menemukan masalah serupa. Saya terkejut mengetahui bahwa ada kasus ketika ini tidak mungkin dilakukan. Saya menggali komentar dari pembuat lsof (Vic Abell) di mana dia menunjukkan bahwa ini sangat bergantung pada implementasi soket unix. Terkadang yang disebut informasi "endpoint" untuk soket tersedia dan terkadang tidak. Sayangnya tidak mungkin di Linux seperti yang dia tunjukkan.

Di Linux, misalnya, di mana lsof harus menggunakan /proc/net/unix, semua soket domain UNIX memiliki jalur terikat, tetapi tidak ada informasi titik akhir. Seringkali tidak ada jalan yang terikat. Itu sering membuat tidak mungkin untuk menentukan titik akhir lainnya, tetapi ini adalah hasil dari implementasi sistem file Linux /proc.

Jika Anda melihat /proc/net/unix Anda dapat melihat sendiri, bahwa (setidaknya di sistem saya) dia benar sekali. Saya masih kaget, karena menurut saya fitur seperti itu penting saat melacak masalah server.

Solusi 3:

Sebenarnya, ss dari iproute2 (pengganti netstat, ifconfig, dll.) dapat menampilkan informasi ini.

Berikut adalah contoh yang menunjukkan soket domain unix ssh-agent yang ssh proses telah terhubung:

$ sudo ss -a --unix -p
Netid  State      Recv-Q Send-Q Local                             Address:Port          Peer    Address:Port
u_str  ESTAB      0      0      /tmp/ssh-XxnMh2MdLBxo/agent.27402 651026                *       651642                users:(("ssh-agent",pid=27403,fd=4)
u_str  ESTAB      0      0       *                                651642                *       651026                users:(("ssh",pid=2019,fd=4))

Solusi 4:

Soket Unix biasanya diberikan nomor berpasangan, dan biasanya berurutan. Jadi pasangan untuk Anda kemungkinan besar adalah 1013410+/-1. Lihat mana dari keduanya yang ada dan tebak pelakunya.

Solusi 5:

Saya menulis alat yang menggunakan metode gdb MvG untuk mendapatkan informasi rekan soket dengan andal, simbol debug kernel tidak diperlukan.

Agar proses terhubung ke soket yang diberikan, berikan nomor inode:

# socket_peer 1013410
3703 thunderbird 

Untuk mengetahui semua proses sekaligus gunakan netstat_unix , itu menambahkan kolom ke keluaran netstat:

# netstat_unix
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Peer PID/Program name  Path
unix  3      [ ]         STREAM     CONNECTED     6825     982/Xorg             1497/compiz            /tmp/.X11-unix/X0
unix  3      [ ]         STREAM     CONNECTED     6824     1497/compiz          982/Xorg                 
unix  3      [ ]         SEQPACKET  CONNECTED     207142   3770/chromium-brows  17783/UMA-Session-R       
unix  3      [ ]         STREAM     CONNECTED     204903   1523/pulseaudio      3703/thunderbird       
unix  3      [ ]         STREAM     CONNECTED     204902   3703/thunderbird     1523/pulseaudio           
unix  3      [ ]         STREAM     CONNECTED     204666   1523/pulseaudio      3703/thunderbird       
...

Coba netstat_unix --dump jika Anda membutuhkan keluaran yang mudah diurai.
Lihat https://github.com/lemonsqueeze/unix_sockets_peers untuk detailnya.

Sebagai info, retasan inode +1/-1 tidak dapat diandalkan. Ini berfungsi sebagian besar waktu tetapi akan gagal atau (lebih buruk) mengembalikan soket yang salah jika Anda kurang beruntung.


Linux
  1. Siapa yang Punya Ujung Lain Dari Socketpair Unix Ini?

  2. Cara:Pemrograman Socket dengan Python

  3. Bagaimana Menemukan Semua File yang Dimiliki oleh Pengguna Tertentu di Unix/Linux?

  1. Cara Menemukan dan Menghapus Direktori dan File Kosong di Unix

  2. Cara menemukan ukuran buffer soket linux

  3. Temukan proses apa yang ada di ujung lain pipa

  1. Bagaimana menemukan direktori home pengguna di linux atau unix?

  2. Bagaimana cara mengetahui akhir baris dalam file teks?

  3. Cara menentukan waktu koneksi soket di Linux