जवाबों:
आप X11 को TCP पर, या एक यूनिक्स डोमेन सॉकेट पर (या लिनक्स पर) अमूर्त नेमस्पेस में एक यूनिक्स डोमेन सॉकेट पर बात कर सकते हैं ।
जब DISPLAY सेट किया जाता है host:4
, तो tcp/host:4
क्लाइंट के लिए सर्वर से कनेक्ट करने के लिए TCP का उपयोग होता है। TCP पोर्ट तब 6000 प्लस डिस्प्ले नंबर (उस स्थिति में 6004) है।
उस स्थिति में, आप किसी भी नेटवर्क स्निफर के साथ tcpdump
या wireshark
उस पोर्ट पर टीसीपी ट्रैफ़िक कैप्चर करके ट्रैफ़िक को कैप्चर कर सकते हैं ।
जब $DISPLAY
केवल :4
(कम के लिए unix/:4
) है, तो ग्राहक एक यूनिक्स डोमेन सॉकेट का उपयोग करते हैं। या तो ABSTRACT नेमस्पेस /tmp/.X11-unix/X4
में एक ही रास्ता (आमतौर पर आउटपुट के रूप में दिखाया गया है )।@/tmp/.X11-unix/X4
netstat
ट्रैफ़िक को पकड़ना तब मुश्किल है।
यदि आपका एक्स सर्वर टीसीपी पर सुनता है (लेकिन वे अब और नहीं करते हैं), तो इसके बजाय बदलने के DISPLAY
लिए सबसे आसान है और लूपबैक इंटरफ़ेस पर पोर्ट 6004 पर नेटवर्क ट्रैफ़िक को कैप्चर करना है।localhost:4
:4
यदि ऐसा नहीं होता है, तो आप बीच मेंsocat
एक आदमी के रूप में उपयोग कर सकते हैं जो टीसीपी के रूप में कनेक्शन स्वीकार करता है और उन्हें यूनिक्स या अमूर्त के रूप में आगे करता है :
socat tcp-listen:6004,reuseaddr,fork unix:/tmp/.X11-unix/X4
फिर आप सेट कर सकते हैं $DISPLAY
करने के लिए localhost:4
और इसके बाद के संस्करण के रूप में नेटवर्क यातायात पर कब्जा या बताने socat
के साथ यह डंप करने के लिए -x -v
।
अब, यदि आप बदल नहीं सकते हैं $DISPLAY
और पहले से चल रहे स्थानीय X एप्लिकेशन के ट्रैफ़िक को कैप्चर करना चाहते हैं, जो कि यूनिक्स डोमेन सॉकेट्स का उपयोग करता है, तो यह वह जगह है जहाँ यह मुश्किल है।
एक दृष्टिकोण का उपयोग करें strace
(या आपके सिस्टम पर समतुल्य कमांड अगर लिनक्स नहीं है) सेंड / रिसीव सिस्टम कॉल को ट्रेस करने के लिए हो सकता है जो आपका एप्लिकेशन एक्स सर्वर के साथ संवाद करने के लिए करता है।
इसके लिए xterm
, मैं इसका पालन करता हूं writev()
, recvfrom()
और उसके recvmsg()
लिए फाइल डिस्क्रिप्टर 3 पर सिस्टम कॉल करता है। तो मैं कर सकता हूँ:
strace -qqxxttts9999999 -e writev,recvmsg,recvfrom -p "$xterm_pid" 2>&1 |
perl -lne '
if (($t,$f,$p) = /^([\d.]+) (writev|recvmsg|recvfrom)\(3, (.*)/) {
@p = ($p =~ /\\x(..)/g);
$dir = $f eq "writev" ? "O" : "I";
while (@p) {print "$dir $t 0000 " . join(" ", splice @p,0,64000)}
}' | text2pcap -T6000,1234 -Dqt %s. - - | wireshark -ki -
(या tshark -Vi -
)।
फ़ीडस्टैम्प और बाइट्स निकालने / प्राप्त करने strace
और उपयोग text2pcap
करने के लिए उपयोग से प्राप्त होने वाले विचार को बदलने के लिए फ़ीड करने से पहले एक pcap
(पोर्ट 6000 पर डमी टीसीपी हेडर जोड़कर) में परिवर्तित करने के -T6000,1234
लिए wireshark
। हमने एक pcap रिकॉर्ड की अधिकतम लंबाई पर 64kiB सीमा से बचने के लिए पैकेट भी विभाजित किए।
के लिए ध्यान दें text2pcap
ट्रैफ़िक की दिशा सही होने के संबंध में ठीक से काम करने के , आपको अपेक्षाकृत हाल के संस्करण की आवश्यकता है।
यदि आप मुख्य रूप से X11 प्रोटोकॉल में रुचि रखते हैं, न कि अंतर्निहित TCP / IP और ईथरनेट सामान, और यदि आप क्लाइंट या सर्वर सेटिंग्स को समायोजित करने में सक्षम हैं, तो आप X11 के बीच ट्रैफ़िक को पकड़ने और डिकोड करने के लिए विशेष रूप से डिज़ाइन किए गए टूल का उपयोग कर सकते हैं क्लाइंट और एक X11 सर्वर। wireshark
एक्स 11 डिसेक्टर के विपरीत , ये उपकरण यातायात से भ्रमित होने की संभावना नहीं है, इसके साथ पूरी तरह से जुड़े हुए हैं।
मुख्य एक xscope है जो कुछ यूनिक्स या लिनक्स वितरणों के लिए बाइनरी के रूप में उपलब्ध नहीं होने के बावजूद आसानी से बनाया जा सकता है स्रोत ।
वैकल्पिक रूप से, xtruss और भी हैं xtrace लेकिन मुझे उनके साथ कोई अनुभव नहीं है।
ये सभी उपकरण एक वास्तविक X11 सर्वर से कनेक्शन रिले करने के लिए रिवर्स-प्रॉक्सि जैसे कार्य करते हैं। क्लाइंट केवल प्रॉक्सी से कनेक्ट करने के लिए एक अलग प्रदर्शन चर (या -डिसप्ले तर्क) का उपयोग करते हैं।
उदाहरण के लिए:
$ wget http://xorg.freedesktop.org/archive/individual/app/xscope-1.4.1.tar.gz
..
$ tar xzf xscope-1.4.1.tar.gz
..
$ cd xscope-1.4.1
$ ./configure && ./make
..
$ ./xscope & sleep 5; xclock -display :1
...
0.00: Client --> 12 bytes
byte-order: LSB first
major-version: 000b
minor-version: 0000
0.00: 692 bytes <-- X11 Server
protocol-major-version: 000b
protocol-minor-version: 0000
release-number: 00adfef8
resource-id-base: 04c00000
resource-id-mask: 001fffff
motion-buffer-size: 00000100
image-byte-order: LSB first
bitmap-format-bit-order: LSB first
bitmap-format-scanline-unit: 20
bitmap-format-scanline-pad: 20
min-keycode: 8 (^H)
max-keycode: 255 (\377)
vendor: "The X.Org Foundation"
pixmap-formats: (7)
roots: (1)
0.00: Client --> 20 bytes
............REQUEST: QueryExtension
name: "BIG-REQUESTS"
0.00: 32 bytes <-- X11 Server
..............REPLY: QueryExtension
present: True
major-opcode: 85
नोट: यदि किसी कारण से आप X11 क्लाइंट सेटिंग्स (डिस्प्ले) नहीं बदल सकते हैं, तो आप सर्वर को एक अलग पोर्ट (आमतौर पर 6001 बनाम 6000) सुनने के लिए पुन: कॉन्फ़िगर करने में सक्षम हो सकते हैं और फिर xscope
मूल पोर्ट (6000) पर सुनने के लिए कॉन्फ़िगर कर सकते हैं।
xtrace -D:1 -d:0 -k
। (या x11trace, जैसा कि निष्पादन योग्य का नाम कुछ
X11 अपने परिवहन प्रोटोकॉल के रूप में टीसीपी का उपयोग करता है। X11 के लिए टीसीपी पोर्ट रेंज आमतौर पर 6000-6063 है लेकिन सबसे अधिक संभावना है कि आप टीसीपी पोर्ट 6000 का उपयोग करते हुए देखेंगे।
इसलिए, आपको इस पोर्ट रेंज और मेजबानों के लिए फ़िल्टर करके ट्रैफ़िक का निरीक्षण करने के लिए अपनी पसंद के किसी भी नेटवर्क मॉनिटर का उपयोग करने में सक्षम होना चाहिए। मुझे यह भी पता है कि wireshark
, उदाहरण के लिए, पहले से ही एक फ़िल्टर प्रीसेट हैx11
आपके द्वारा ट्रैफ़िक की निगरानी करने के लिए है।
उदाहरण के लिए, स्थानीय मशीन पर सभी X11 ट्रैफ़िक की निगरानी करने के लिए (यदि TCP का उपयोग कर रहे हैं; @ Stéphane Chazelas के उत्तर को देखें) निम्न फ़िल्टर का उपयोग करें:
x11 and ip.src=127.0.0.1 and ip.dst=127.0.0.1
lsof -U | grep '^X'
।