यूनिक्स सॉकेट कनेक्शन के दूसरे छोर को कैसे खोजें?


44

मेरे पास एक प्रक्रिया (dbus-daemon) है जिसमें UNIX सॉकेट्स के कई खुले कनेक्शन हैं। इनमें से एक कनेक्शन 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

संख्या कनेक्शन के आधार पर, मुझे लगता है कि डब-डेमॉन वास्तव में सर्वर है। जो ठीक है। लेकिन मैं यह कैसे पता लगा सकता हूं कि कौन सी प्रक्रिया इससे जुड़ी हुई है - उस कनेक्शन का उपयोग करके जो डब-लॉन्चर में 36 वीं फाइल हैंडल है? कोशिश की lsof और यहां तक ​​कि greps पर / proc / net / unix लेकिन मैं क्लाइंट प्रक्रिया को खोजने का एक तरीका नहीं समझ सकता।


इसका उत्तर यू एंड एल पर दिया गया है: इस यूनिक्स सॉकेटपेयर का दूसरा छोर किसे मिला है?
sch

जवाबों:


25

हाल ही में मैं एक ऐसी ही समस्या पर ठोकर खाई। मुझे यह जानकर झटका लगा कि ऐसे मामले हैं जब यह संभव नहीं हो सकता है। मैंने lsof (विकी एबेल) के निर्माता की एक टिप्पणी को खोदा, जहां उन्होंने बताया कि यह यूनिक्स सॉकेट कार्यान्वयन पर बहुत अधिक निर्भर करता है। सॉकेट के लिए कभी-कभी तथाकथित "समापन बिंदु" जानकारी उपलब्ध है और कभी-कभी नहीं। जैसा कि वह बताते हैं कि दुर्भाग्य से लिनक्स में यह असंभव है।

लिनक्स पर, उदाहरण के लिए, जहाँ lsof को / proc / net / unix का उपयोग करना चाहिए, सभी UNIX डोमेन सॉकेट में एक बाउंड पथ है, लेकिन कोई समापन बिंदु जानकारी नहीं है। अक्सर कोई बाध्य मार्ग नहीं होता है। यह अक्सर दूसरे समापन बिंदु को निर्धारित करना असंभव बनाता है, लेकिन यह लिनक्स / proc फाइल सिस्टम कार्यान्वयन का एक परिणाम है।

यदि आप / proc / net / unix देखते हैं तो आप अपने लिए देख सकते हैं, कि (कम से कम मेरे सिस्टम पर) वह निरपेक्ष रूप से सही है। मैं अभी भी हैरान हूं, क्योंकि मुझे सर्वर की समस्याओं को ट्रैक करते समय ऐसी सुविधा आवश्यक है।



ध्यान दें कि /proc/net/unixआपके द्वारा खोदा गया एक यादृच्छिक डोमेन सॉकेट संदर्भ का लक्ष्य फ़ाइल आपको बताएगा /proc/.../fd/
०३६__

26

यह उत्तर केवल लिनक्स के लिए है। यूनिक्स और लिनक्स स्टैक एक्सचेंज के एक उत्तर के आधार पर , मैंने सफलतापूर्वक इन-कर्नेल डेटा संरचनाओं का उपयोग करते हुए एक यूनिक्स डोमेन सॉकेट के दूसरे छोर की पहचान की, का उपयोग करके gdbऔर /proc/kcore। आप सक्षम करने की आवश्यकता CONFIG_DEBUG_INFOहै और CONFIG_PROC_KCOREकर्नेल विकल्प।

आप lsofसॉकेट का कर्नेल पता प्राप्त करने के लिए उपयोग कर सकते हैं , जो एक पॉइंटर का रूप लेता है, जैसे 0xffff8803e256d9c0। वह संख्या वास्तव में संबंधित इन-कर्नेल मेमोरी संरचना या प्रकार का पता है struct unix_sock। उस संरचना में एक फ़ील्ड होता है जिसे peerसॉकेट के दूसरे छोर पर इंगित किया जाता है । तो आज्ञा

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

कनेक्शन के दूसरे छोर का पता प्रिंट करेगा। आप lsof -Uउस संख्या के लिए उस प्रक्रिया के आउटपुट को पहचान सकते हैं और उस दूसरे छोर के डिस्क्रिप्टर नंबर को दर्ज कर सकते हैं।

कुछ वितरण कर्नेल डिबग प्रतीकों को एक अलग पैकेज के रूप में प्रदान करते हैं, जो vmlinuxउपरोक्त कमांड में फ़ाइल की जगह लेगा ।


यह दिलचस्प लग रहा है, लेकिन कर्नेल को फिर से खोलने के लिए आवश्यकता एक ओवरकिल लगती है। मैं सोच रहा हूं कि शायद यह करना संभव होगा, बिना हाथ से बनाए कर्नेल के बिना, और जीडीबी का उपयोग किए बिना, केवल कोरॉक में मूल्यों को देखकर और मूल्यों के कुछ "मैनुअल" डिकोडिंग करके।

3
@depesz, आप सभी को पता होना चाहिए peerकि unix_sockसंरचना में सदस्य की भरपाई है । मेरे x86_64 सिस्टम पर, वह ऑफसेट 656 बाइट्स है, इसलिए मैं उस दूसरे छोर का उपयोग करके प्राप्त कर सकता हूं p ((void**)0xffff8803e256d9c0)[0x52]। आपको अभी भी CONFIG_PROC_KCORE, जाहिर है
एमवीजी

11

वास्तव में, ssसे iproute2(netstat, ifconfig, आदि के लिए प्रतिस्थापन) इस जानकारी को दिखा सकते हैं।

यहाँ एक उदाहरण है जो एक ssh- एजेंट यूनिक्स डोमेन सॉकेट दिखा रहा है जिससे एक sshप्रक्रिया जुड़ी है:

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

हम्म। दिलचस्प ... मुझे याद था कि "पता: पोर्ट" कॉलम का मिलान किया जा सकता है, भले ही "पीयर" कॉलम यूनिक्स डोमेन सॉकेट के लिए पूरी तरह से बेकार हो।
सैमबी

9

यूनिक्स सॉकेट्स को आमतौर पर जोड़े में नंबर दिए जाते हैं, और आमतौर पर लगातार होते हैं। तो आपके लिए जोड़ी संभवतः 1013410 +/- 1 होगी। देखें कि उन दोनों में से कौन मौजूद है और अपराधी पर लगता है।


8

मैंने एक उपकरण लिखा है जो कि सॉकेट पीयर की जानकारी प्राप्त करने के लिए एमवीजी के जीडीबी विधि का उपयोग करता है , कर्नेल डीबग प्रतीकों की आवश्यकता नहीं है।

किसी दिए गए सॉकेट से जुड़ी प्रक्रिया को प्राप्त करने के लिए, इसे इनकोड नंबर दें:

# socket_peer 1013410
3703 thunderbird 

एक बार उपयोग करने पर सभी प्रक्रियाओं का पता लगाने के लिए netstat_unix, यह 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       
...

प्रयास करें netstat_unix --dumpयदि आप उत्पादन पार्स करने के लिए आसान है कि जरूरत है।
देखें https://github.com/lemonsqueeze/unix_sockets_peers जानकारी के लिए।

जानकारी के लिए, इनोड + 1 / -1 हैक विश्वसनीय नहीं है। यह ज्यादातर समय काम करता है लेकिन अगर आप किस्मत से बाहर हैं तो (या) गलत सॉकेट लौटा देंगे।


1

अपना system.conf संपादित करें

इस फ़ाइल में आप डीबगिंग उद्देश्य के लिए अधिक सामान जोड़ सकते हैं।

फाइल का पता: /etc/dbus-1/system.conf

डीबग करने के उद्देश्य के लिए, आप अपने सिस्टम को संपादित कर सकते हैं।

  1. नीति अनुभाग को इसके द्वारा प्रतिस्थापित करें:

    <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. शामिल लाइन निकालें: system.d

    <includedir>system.d</includedir>

स्रोत: http://old.nabble.com/dbus-send-error-td29893862.html


यूनिक्स सॉकेट्स के बारे में कुछ अन्य उपयोगी चीजें

यह पता लगाने का सबसे सरल तरीका है कि बस में क्या हो रहा है dbus-monitor, कार्यक्रम को चलाने के लिए है, जो डी-बस पैकेज के साथ आता है

इसके अलावा आप dbus-cleanup-socketsबचे हुए सॉकेट को साफ करने के लिए उपयोग करने का प्रयास कर सकते हैं।

निम्नलिखित कमांड आपको दिखाएगी कि कौन सी प्रक्रिया जुड़ी हुई है, जो netstatआउटपुट के आधार पर सॉक्स को कितनी बार दबाया गया है:

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

(उबंटू पर परीक्षण किया गया)

कट्टर तरीका: यह कमांड मैन्युअल रूप से / खरीद और शो से मिलने वाली प्रक्रियाओं को पाएगा जो सबसे अधिक कनेक्शन (सभी प्रकार के सॉकेट) का उपयोग कर रहे हैं:

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")}'

उदाहरण आउटपुट:

(गणना, पीआईडी ​​और अगली पंक्ति में प्रक्रिया के बारे में विवरण शामिल है)

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

(उबंटू पर परीक्षण किया गया)

मज़े करो।


संदर्भ के लिए संबंधित लेख भी देखें:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.