सूँघा UNIX डोमेन सॉकेट


9

मुझे पता है कि कुछ प्रक्रिया एक निश्चित यूनिक्स डोमेन सॉकेट ( /var/run/asterisk/asterisk.ctl) के लिए लिख रही है , लेकिन मुझे प्रेषक की जानकारी नहीं है। मुझे कैसे पता चलेगा कि सॉकेट को कौन लिख रहा है? मैंने कोशिश की है:

sudo lsof /var/run/asterisk/asterisk.ctl

लेकिन यह सिर्फ सॉकेट के मालिक को सूचीबद्ध करता है। मैं जानना चाहूंगा कि इस सॉकेट को कौन लिख / पढ़ रहा है, और मैं डेटा को सूँघना भी चाहूंगा। क्या यह संभव है?

जवाबों:


4

छोटे जवाब नहीं हैं और आसानी से नहीं।

लिनक्स पर lsof /proc/net/unixUNIX डोमेन सॉकेट के बारे में जानकारी प्राप्त करने के लिए निर्भर करता है । यह इंटरफ़ेस सभी बाध्य सॉकेट्स को सूचीबद्ध करता है, लेकिन यह समापन बिंदुओं का ट्रैक नहीं रखता है। तो आप देख सकते हैं कि क्या कुर्सियां ​​मौजूद हैं, लेकिन आप यह नहीं देख सकते हैं कि उनसे क्या जुड़ा है। कहीं न कहीं इस जानकारी है किसी और काम पर नज़र रखी है, यह होना चाहिए पर नज़र रखी जा या सॉकेट कनेक्शन नहीं होता। मुझे अभी तक कनेक्शन जानकारी प्राप्त करने के लिए कोई भी तंत्र नहीं मिला है।

सूँघने का सवाल थोड़ा और दिलचस्प है, लेकिन कम निराशाजनक नहीं है। "मुझे आसानी से नहीं" से क्या मतलब है कि उस डेटा को छींकने और लपेटने के लिए कोई हुक मौजूद नहीं है। निकटतम एनालॉग tcpdump या Wireshark का उपयोग कर रहा है, दोनों ही वास्तव में हेवी लिफ्टिंग करने के लिए libpcap का उपयोग करते हैं। जबकि नेटवर्क (AF_INET) और UNIX डोमेन (AF_UNIX) दोनों socket()फ़ंक्शन कॉल का उपयोग करके बनाए गए हैं , दोनों connect()कनेक्ट करने के लिए उपयोग करते हैं, दोनों का उपयोग करते हैं read()और write()डेटा को संसाधित करने के लिए, वे अलग-अलग कर्नेल सबसिस्टम द्वारा नियंत्रित किए जाते हैं। इसका दुर्भाग्यपूर्ण दुष्प्रभाव है कि UNIX डोमेन सॉकेट के साथ काम करने के लिए libpcap को डिज़ाइन नहीं किया गया है।

समस्या के लिए थोड़ा कम पक्ष है। के लिए मैन पेज पर एक नज़र डालें recv(2)। यह एक निचले स्तर का सिस्टम कॉल है read()जो इसका उपयोग करता है। recv()कहा जाता है के लिए एक ध्वज मौजूद है MSG_PEEK। यह आपको UNIX डोमेन सॉकेट से गुजरने वाले ट्रैफ़िक को सूँघने की अनुमति देगा। तो यह उज्ज्वल पक्ष है, अंधेरे पक्ष यह है कि मेरे ज्ञान का सबसे अच्छा करने के लिए ऐसा करने के लिए डिज़ाइन किया गया कोई भी मौजूदा एप्लिकेशन मौजूद नहीं है। तो आप कुछ विकास के प्रयास देख रहे हैं।

मैं वास्तव में चाहता हूं कि आपके प्रश्न के दोनों भागों में F'YEAH का एक अच्छा सरल उत्तर था


11

हां, आप यह कर सकते हैं। बस आपको सिस्टमटैप की जरूरत है।

उदाहरण के एक सिस्टमटैप स्क्रिप्ट पर विचार करें जो किसी भी प्रोग्राम के पीआईडी ​​और प्रक्रिया के नाम को प्रिंट करेगा जो एक निर्दिष्ट इनोड को पढ़ता है या लिखता है (और आपका यूनिक्स डोमेन सॉकेट बस इतनी सी बात है)।

आप पढ़े / लिखे जा रहे वास्तविक डेटा को प्रिंट करने के लिए इस स्क्रिप्ट को तुच्छ रूप से संशोधित कर सकते हैं; मैं पाठक को एक अभ्यास के रूप में ऐसा करना छोड़ दूँगा।


4

मुझे पता है कि यह मुख्य प्रश्न का उत्तर नहीं दे रहा है, लेकिन मैं यहां समाप्त हो गया हूं, एक सॉकेट पर संचार को सूँघने के लिए खोज रहा हूं। मैंने अपने जैसे दूसरों के लिए पोस्ट करने का फैसला किया है। यहाँ मैंने यह कैसे किया:

INR

आप निकाल सकते हैं -x और सिर्फ आस्की संचार के लिए -v छोड़ दें। आशा है कि किसी की मदद करता है।


पूरी तरह से काम करता है
जेस्मिथ

-1

समाज -t100 UNIX-LISTEN: /tmp/file.sock,mode=777,reuseaddr,fork STDOUT

आउटपुट का कोई दोहराव नहीं है, कोई चक्रीय आउटपुट नहीं है। पिछली टिप्पणी की त्रुटि ".sock.socat"


2
हालाँकि यह एक उपयोगी कमांड हो सकता है, कृपया कुछ स्पष्टीकरण / स्पष्टीकरण जोड़ें (और इस उत्तर से यह कैसे भिन्न है ?)
HBruijn

मुझे माफ कर दो। आउटपुट का कोई दोहराव नहीं है, कोई चक्रीय आउटपुट नहीं है। पिछली टिप्पणी की त्रुटि ".sock.socat"
srvf
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.