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.