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


मेरे पास एक प्रक्रिया है (डीबीस-डिमन) जिसमें यूनिक्स सॉकेट पर कई खुले कनेक्शन हैं। इनमें से एक कनेक्शन एफडी # 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

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


38
2018-03-28 13:35


मूल


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


जवाब:


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

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

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


23
2018-06-03 09:03



संदर्भ: groups.google.com/forum/#!topic/comp.unix.admin/iZLsq5dHdyI - estani
ध्यान दें कि /proc/net/unix आपको एक यादृच्छिक डोमेन सॉकेट संदर्भ की लक्ष्य फ़ाइल बताएगी जिसे आपने खोला है /proc/.../fd/। - i336_


यह उत्तर केवल लिनक्स के लिए है। पर आधारित एक जवाब यूनिक्स और लिनक्स स्टैक एक्सचेंज से, मैं सफलतापूर्वक पहचाना गया इन-कर्नेल डेटा संरचनाओं का उपयोग करके एक यूनिक्स डोमेन सॉकेट का दूसरा सिरा, उपयोग किया जाता है 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

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

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


23
2017-08-15 20:31



यह दिलचस्प लग रहा है, लेकिन कर्नेल को पुन: संकलित करने की आवश्यकता एक ओवरकिल लगती है। मैं सोच रहा हूं कि हाथ से बने कर्नेल के बिना, और जीडीबी का उपयोग किए बिना, यह संभवतः कोकोर में मूल्यों पर ध्यान देकर और मूल्यों के कुछ "मैन्युअल" डिकोडिंग करके करना संभव होगा।
@depesz, आपको बस इतना पता होना चाहिए कि ऑफसेट है peer में सदस्य unix_sock संरचना। मेरी x86_64 प्रणाली पर, ऑफसेट 656 बाइट्स है, इसलिए मैं उस दूसरे छोर का उपयोग कर प्राप्त कर सकता हूं p ((void**)0xffff8803e256d9c0)[0x52]। आपको अब भी ज़रूरत है CONFIG_PROC_KCORE, जाहिर है। - MvG


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


9
2018-01-26 22:13





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

यहां एक उदाहरण है जो एक एसएसएच-एजेंट यूनिक्स डोमेन सॉकेट दिखा रहा है जिसमें ए 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))

8
2018-03-06 13:01



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


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

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

# 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 हैक विश्वसनीय नहीं है। यह ज्यादातर समय काम करता है लेकिन अगर आप भाग्य से बाहर हैं तो गलत सॉकेट वापस आ जाएंगे (बदतर)।


6
2017-11-14 14:44



बहुत उपयोगी, स्क्रिप्ट के लिए धन्यवाद! - Tonin


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

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

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

डीबगिंग उद्देश्य के लिए, आप अनुमति देने के लिए अपने 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. Includir लाइन निकालें: 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

(उबंटू पर परीक्षण)

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

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

(उबंटू पर परीक्षण)

मज़े करो।


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


1
2017-09-19 16:25