क्या मैं tcpdump की तरह एक स्थानीय यूनिक्स डोमेन सॉकेट की निगरानी कर सकता हूं?


59

मैं मूल कनेक्शन को परेशान किए बिना एक यूनिक्स सॉकेट पर प्रतिक्रियाओं की निगरानी करना चाहता हूं और उन्हें प्रसंस्करण के लिए एक स्क्रिप्ट पर पाइप करता हूं।

मुझे पता है कि tcp कनेक्शन के लिए tcpdump के साथ यह कैसे करना है, लेकिन मैं स्थानीय यूनिक्स सॉकेट के लिए कोई समाधान नहीं ढूंढ सकता।

क्या यह भी संभव है?


जवाबों:


15

एक आदमी है जो ऐसा करने का दावा करता है जो एक ऐप बनाकर दो सॉकेट के बीच प्रवेश द्वार के रूप में कार्य करता है और सभी डेटा को लॉग करता है जो बहता है। इसलिए आप सॉकेट पर टैप नहीं कर सकते हैं, लेकिन यदि आप सेवा को फिर से शुरू कर सकते हैं और इस धुन का उपयोग कर सकते हैं तो इस ऐप का उपयोग करके आप सभी ट्रैफ़िक देख पाएंगे।

यहाँ पोस्ट का लिंक दिया गया है: यूनिक्स सॉकेट स्निफर

एक और तरीका है जो आपको सॉकेट से जुड़ी प्रक्रिया आईडी को खोजने की आवश्यकता है, फिर सॉकेट की फ़ाइल डिस्क्रिप्टर के साथ lsof ढूंढें और फिर स्ट्रेस का उपयोग करके फ़ाइल डिस्क्रिप्टर पर टैप करें।

यदि आप सॉकेट का उपयोग करने वाले क्लाइंट / सर्वर को रोक सकते हैं और इसे फिर से कॉन्फ़िगर कर सकते हैं तो मैं हमेशा पहली विधि, दूसरी विधि की सिफारिश करूंगा, यह मुश्किल है और आपको एक वर्तमान प्रक्रिया को टैप करने की आवश्यकता होती है जो कुछ ऐप्स पर क्रैश होने का कारण बन सकती है।

आशा है कि कोई हमें एनोटर तरीके से प्रबुद्ध करेगा :)

सौभाग्य


याह, आप सोसाइटी के साथ बिचौलिए विधि भी कर सकते हैं, लेकिन मैं मौजूदा सेटिंग्स को अन्यत्र संशोधित किए बिना अधिक प्रत्यक्ष तरीके की उम्मीद कर रहा हूं।
ck_

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

3
क्यों यह सीधे संभव नहीं है कुछ और चारों ओर से खुदाई करने के बाद मैं बारे में कुछ विवरण के साथ एक समान प्रश्न पाया पर stackoverflow stackoverflow.com/questions/8394613/...
ck_

80

आप सोसैट का उपयोग कर सकते हैं।

sudo mv /path/to/sock /path/to/sock.original
sudo socat -t100 -x -v UNIX-LISTEN:/path/to/sock,mode=777,reuseaddr,fork UNIX-CONNECT:/path/to/sock.original

ऊपर क्या हो रहा है: पहले मूल सॉकेट को sock.original पर ले जाएं। सोकत मूल स्थान में एक नया सॉकेट ('UNIX-LISTEN') बनाता है और आगे के सभी मूल ('UNIX-connect') को बनाता है। -V समाज को STDERR को आउटपुट प्रिंट करने के लिए भी कहता है।


3
थोड़ा और स्पष्टीकरण जोड़ने के लिए देखभाल?
कज़र्क

4
यह आसान है जब मूल यूनिक्स सॉकेट का फाइल सिस्टम पर एक रास्ता है। लेकिन क्या होगा अगर यह एक अमूर्त नामस्थान यूनिक्स सॉकेट है जिसे आप वास्तव में स्थानांतरित नहीं कर सकते हैं?
वेलेरियो शियावोनी

6

आप सॉकेट के दोनों ओर की प्रक्रियाओं में से किसी एक पर स्ट्रेस का उपयोग करने की कोशिश कर सकते हैं, क्योंकि यह आपको यह देखने देगा कि क्या लिखा / पढ़ा गया है। मैंने अपने उत्पादन परिवेशों में पाया, मेरे पास समाज नहीं है, लेकिन स्ट्रेस है।

किसी भी उपयोगी उद्देश्य के लिए, कुछ बड़ा करने के लिए सेटिंग करना आवश्यक है।


इसने मेरे लिए अच्छा काम किया, और करना आसान है। strace -p <pid>रनिंग प्रक्रिया देखने के लिए उपयोग करें ।
मैट मुनसन

त्वरित आदेश: strace -s9999 -f $(for i in $( pidof php5-fpm ) ; do echo -n " -p $i "; done ) 2>&1 | tee /tmp/php.logऔर फिर परीक्षण चलाते हैं। यदि लॉग बहुत बड़ा है, तो आपको धीरे-धीरे जांचने के लिए /tmp/php.log है। यदि आप बहुत अधिक ट्रैफ़िक प्राप्त कर रहे हैं, तो अपने नाम या किसी चीज़ के साथ क्वेरी-स्ट्रिंग के साथ एक अनुरोध करें ताकि आप लॉग में इसे खोज
सकें

1
@higuita मुझे पता है कि यह एक लंबा समय हो गया है, लेकिन उस पाश के बजाय आप printfदोहराव को संभालने दे सकते हैं । printf " -p %s" $(pidof php5-fpm)प्रत्येक पीड तर्क के साथ उपसर्ग करेगा -pऔर लिखने के लिए अधिक व्यावहारिक है।
जोएल

2
// backup the socket
sudo mv /var/run/docker.sock /var/run/docker.sock.original

// use tcp port 8089 proxy the original socket
sudo socat TCP-LISTEN:8089,reuseaddr,fork UNIX-CONNECT:/var/run/docker.sock.original

// use the new socket to proxy the 8089 port
sudo socat UNIX-LISTEN:/var/run/docker.sock,fork TCP-CONNECT:127.0.0.1:8089

फिर:

sudo tcpdump -i lo -netvv port 8089

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