Unix soket bağlantısının diğer ucunu nasıl bulabilirim?


44

UNIX soketleri üzerinde birçok açık bağlantıya sahip bir işlemim (dbus-daemon) var. Bu bağlantılardan biri fd # 36:

=$ ps uw -p 23284
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
depesz   23284  0.0  0.0  24680  1772 ?        Ss   15:25   0:00 /bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

=$ ls -l /proc/23284/fd/36 
lrwx------ 1 depesz depesz 64 2011-03-28 15:32 /proc/23284/fd/36 -> socket:[1013410]

=$ netstat -nxp | grep 1013410
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

=$ netstat -nxp | grep dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013953  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013825  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013726  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013471  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1013410  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012325  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012302  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012289  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1012151  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011957  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011937  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011900  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011775  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011771  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011769  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011766  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011663  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011635  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011627  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011540  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011480  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011349  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011312  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011284  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011250  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011231  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011155  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011061  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011049  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011035  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1011013  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010961  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD
unix  3      [ ]         STREAM     CONNECTED     1010945  23284/dbus-daemon   @/tmp/dbus-3XDU4PYEzD

Sayı bağlantılarına dayanarak, dbus-daemon'un gerçekte sunucu olduğunu kabul ediyorum. Hangisi iyi. Ama hangi sürecin kendisine bağlı olduğunu nasıl bulabilirim - dbus-başlatıcısında 36. dosya tanıtıcısı olan bağlantıyı kullanarak? Lsof'u denedik ve hatta / proc / net / unix ile uğraşıyorum, ancak müşteri işlemini bulmanın bir yolunu bulamıyorum.


Yanıtlar:


25

Son zamanlarda benzer bir sorunla karşılaştım. Bunun mümkün olamayacağı durumlar olduğunu öğrendiğimde şok oldum. Lsof (Vic Abell) 'in yaratıcısından, bunun büyük ölçüde unix soket uygulamasına bağlı olduğuna dikkat çektiği bir yorum yaptım. Bazen soket için "uç nokta" adı verilen bilgiler mevcuttur ve bazen yoktur. Maalesef Linux'ta işaret ettiği gibi imkansız.

Linux'ta, örneğin, / proc / net / unix kullanması gereken yerlerde, tüm UNIX etki alanı soketlerinin bağlı bir yolu vardır, ancak son nokta bilgileri yoktur. Genellikle, bağlı bir yol yoktur. Bu genellikle diğer uç noktayı belirlemeyi imkansız hale getirir, ancak Linux / proc dosya sistemi uygulamasının bir sonucudur.

Eğer / proc / net / unix'e bakarsanız kendiniz görebilirsiniz, (en azından benim sistemimde) kesinlikle haklı. Hala şok oldum, çünkü sunucu sorunlarını takip ederken böyle bir özelliği gerekli buluyorum.



WILL'ın, çıkardığınız /proc/net/unixrastgele etki alanı soket başvurusunun hedef dosyasını size söyleyeceğini unutmayın /proc/.../fd/.
i336_

26

Bu cevap sadece Linux içindir. Unix ve Linux Stack Exchange'den gelen bir cevaba dayanarak, unix domain soketinin diğer ucunu, ve kullanarak erişilen çekirdek veri yapılarını kullanarak başarıyla tanımladım . Ve çekirdek seçeneklerini etkinleştirmeniz gerekir .gdb/proc/kcoreCONFIG_DEBUG_INFOCONFIG_PROC_KCORE

lsofÖrneğin bir işaretçi şeklini alan soketin çekirdek adresini almak için kullanabilirsiniz 0xffff8803e256d9c0. Bu sayı aslında ilgili çekirdek içi bellek yapısının veya türünün adresidir struct unix_sock. Bu yapının peersoketin diğer ucuna işaret eden bir alanı vardır . Öyleyse komutlar

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

Bağlantının diğer ucunun adresini yazdıracaktır. lsof -Uİşlemi ve diğer uçtaki dosya tanımlayıcı numarasını tanımlamak için bu sayının çıktısını elde edebilirsiniz .

Bazı dağıtımlar, çekirdek hata ayıklama sembollerini vmlinux, yukarıdaki komutta dosyanın yerini alacak ayrı bir paket olarak sunuyor gibi görünmektedir .


Bu ilginç görünüyor, ancak çekirdeği yeniden derleme gereksinimi fazlaca görünüyor. Belki el yapımı çekirdek olmadan ve gdb kullanmadan, sadece kcore'daki değerlere göz atarak ve değerlerin "manuel" kod çözme işlemlerini yaparak bunu yapmanın mümkün olacağını düşünüyorum.

3
@depesz, bilmeniz gereken tüm dengeleniyor peerüyesi olmasıyla unix_sockyapısı. X86_64 sistemimde bu ofset 656 bayttır, bu yüzden diğer ucunu kullanarak elde edebilirim p ((void**)0xffff8803e256d9c0)[0x52]. CONFIG_PROC_KCOREBelli ki hala ihtiyacın var .
MvG

11

Aslında ssdan iproute2(netstat, ifconfig, vs. değiştirme) bu bilgileri gösterebilir.

Bir sshişlemin bağlı olduğu bir ssh-agent unix alan soketini gösteren bir örnek :

$ 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))

Hmm. İlginç ... "Eş" sütunu unix alan soketleri için tamamen işe yaramaz olsa da, "Adres: Bağlantı Noktası" sütunlarının eşleştirilebileceğini özlemiştim.
SamB

9

Unix soketleri genellikle çiftler halinde sayılar olarak verilir ve genellikle ardışıktır. Yani sizin için çifti muhtemelen 1013410 +/- 1 olacaktır. Bu ikisinden hangisinin var olduğunu görün ve suçluyu tahmin edin.


8

MvG'nin gdb yöntemini kullanarak güvenilir bir soket bilgisi elde etmek için bir araç yazdım , çekirdek hata ayıklama sembollerine gerek duyulmaz.

Süreci belirli bir sokete bağlamak için, inode numarasını iletin:

# socket_peer 1013410
3703 thunderbird 

Bir kerede kullanımdaki tüm işlemleri öğrenmek netstat_unixiçin netstat'ın çıktısına bir sütun ekler:

# 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       
...

netstat_unix --dumpAyrıştırılması kolay çıktıya ihtiyacınız varsa deneyin .
Ayrıntılar için https://github.com/lemonsqueeze/unix_sockets_peers adresine bakın.

Bilgi için, inode + 1 / -1 hack güvenilir değil. Çoğu zaman çalışır, ancak başarısız olursanız veya (daha da kötüsü) şanssız kalırsanız yanlış soketi döndürür.


1

System.conf dosyanızı düzenleyin

Bu dosyada hata ayıklama amacıyla daha fazla şeyler ekleyebilirsiniz.

Dosya konumu: /etc/dbus-1/system.conf

Hata ayıklama amacıyla, sistem dinlemenizi gizlice izin vermek için düzenleyebilirsiniz:

  1. politika bölümünü değiştirerek:

    <policy context="default">

    <!-- Allow everything to be sent -->

    <allow send_destination="*" eavesdrop="true"/>

    <!-- Allow everything to be received -->

    <allow eavesdrop="true"/>

    <!-- Allow anyone to own anything -->

    <allow own="*"/>

    <!-- XXX: Allow all users to connect -->

    <allow user="*"/> </policy>

  2. İncludedir satırını kaldırın: system.d

    <includedir>system.d</includedir>

Kaynak: http://old.nabble.com/dbus-send-error-td29893862.html


Unix soketleriyle ilgili başka yararlı şeyler

Otobüste neler olduğunu anlamanın en basit yolu dbus-monitor, D-Bus paketi ile birlikte gelen programı çalıştırmak.

Ayrıca dbus-cleanup-socketskalan yuvaları temizlemek için de kullanabilirsiniz .

Aşağıdaki komut, hangi işlemin netstatçıkışa bağlı dbus soketlerine kaç kez bağlı olduğunu gösterecektir :

sudo netstat -nap | grep dbus | grep CONNECTED | awk '{print $8}' | sort | uniq -c

(Ubuntu'da test edilmiştir)

Hardcore yolu: Bu komut, / proc ve hangi bağlantıların en çok kullanılan (her tür soket) kullandığını gösteren işlemleri manuel olarak bulur:

ls -lR */fd/* | grep socket | sed -r "s@([0-9{1}]+)/fd/@_\1_@g" | awk -F_ '{print $2}' | uniq -c | sort -n | awk '{print $1" "$2; print system("ps "$2"|tail -n1")}'

Örnek çıktı:

(say, PID ve bir sonraki satır süreçle ilgili detayları içerir)

25 3732
 3732 ?        Ss     0:38 /usr/bin/wineserver
89 1970
 1970 ?        Ss     0:02 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

(Ubuntu'da test edilmiştir)

İyi eğlenceler.


Referans için ayrıca ilgili makalelere bakın:

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.