जब तक आपका एक्स-सर्वर एक्स-रिसोर्स v1.2 एक्सटेंशनXResQueryClientIds
से समर्थन करता है , मुझे पता है कि प्रक्रिया आईडी के लिए मज़बूती से अनुरोध करने का कोई आसान तरीका नहीं है । हालांकि अन्य तरीके हैं।
यदि आपके पास बस एक खिड़की है और अभी तक इसकी आईडी नहीं जानते हैं - तो इसे पता लगाना आसान है। बस प्रश्न में खिड़की के बगल में एक टर्मिनल खोलें, xwininfo
वहां दौड़ें और उस खिड़की पर क्लिक करें। xwininfo
आपको विंडो-आईडी दिखाएगा।
तो चलिए मान लेते हैं कि आप एक विंडो-आईडी जानते हैं, उदाहरण के लिए 0x1600045, और इसे ढूंढना चाहते हैं, इसकी प्रक्रिया क्या है।
यह जांचने का सबसे आसान तरीका है कि वह खिड़की किसकी है, इसके लिए XKillClient चलाना है:
xkill -id 0x1600045
और देखते हैं कि कौन सी प्रक्रिया अभी मर गई। लेकिन केवल अगर आप इसे मारने का मन नहीं है!
एक और आसान लेकिन अविश्वसनीय तरीका इसकी _NET_WM_PID
और WM_CLIENT_MACHINE
गुणों की जांच करना है :
xprop -id 0x1600045
यही उपकरण पसंद करते हैं xlsclients
और xrestop
करते हैं।
दुर्भाग्य से यह जानकारी न केवल गलत हो सकती है क्योंकि प्रक्रिया बुराई थी और उन लोगों को बदल दिया, लेकिन यह भी क्योंकि यह छोटी गाड़ी थी। उदाहरण के लिए कुछ फ़ायरफ़ॉक्स दुर्घटना / पुनः आरंभ होने के बाद, मैंने _NET_WM_PID
एक प्रक्रिया की ओर इशारा करते हुए अनाथ खिड़कियां (फ्लैश प्लगइन से, मुझे लगता है) देखी है, जो बहुत पहले मर गई थी।
वैकल्पिक रास्ता चलाना है
xwininfo -root -tree
और प्रश्न में खिड़की के माता-पिता के गुणों की जांच करें। यह भी आपको खिड़की की उत्पत्ति के बारे में कुछ संकेत दे सकता है।
परंतु! जब आप यह नहीं जान सकते हैं कि उस विंडो को किस प्रक्रिया से बनाया गया है, तब भी यह पता लगाने का एक तरीका है कि उस प्रक्रिया को कहां से एक्स-सर्वर से जोड़ा गया है। और यह तरीका असली हैकर्स के लिए है। :)
विंडो-आईडी 0x1600045 जिसे आप कम बिट्स शून्य (यानी 0x1600000) के साथ जानते हैं, एक "क्लाइंट बेस" है। और उस क्लाइंट के लिए आवंटित सभी संसाधन आईडी, उस पर (0x1600001, 0x1600002, 0x1600003, आदि) आधारित हैं। X- सर्वर अपने ग्राहकों के बारे में ग्राहकों [] सरणी में जानकारी संग्रहीत करता है, और प्रत्येक ग्राहक के लिए इसका "आधार" ग्राहकों [i] -> clientAsMask चर में संग्रहीत किया जाता है। उस क्लाइंट के अनुरूप, एक्स-सॉकेट को खोजने के लिए, आपको एक्स-सर्वर के साथ संलग्न करना होगा gdb
, क्लाइंट पर चलना होगा [] सरणी, उस के साथ क्लाइंट ढूंढें clientAsMask
और उसके (सॉस्कट्रेट) (क्लाइंट [i] में संग्रहित सॉकेट डिस्क्रिप्टर को प्रिंट करें। > osPrivate)) -> fd।
कई एक्स-क्लाइंट जुड़े हो सकते हैं, इसलिए उन सभी को मैन्युअल रूप से जांचने के लिए नहीं, चलो एक gdb फ़ंक्शन का उपयोग करें:
define findclient
set $ii = 0
while ($ii < currentMaxClients)
if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
end
set $ii = $ii + 1
end
end
जब आप सॉकेट ढूंढते हैं, तो आप जांच कर सकते हैं कि कौन किससे जुड़ा है, और आखिरकार प्रक्रिया का पता लगाएं।
चेतावनी : एक्स-सर्वर से एक्स-सर्वर से जीडीबी संलग्न न करें। gdb उस प्रक्रिया को निलंबित कर देता है जिसे वह संलग्न करता है, इसलिए यदि आप इसे X- सत्र के अंदर से संलग्न करते हैं, तो आप अपने एक्स-सर्वर को फ्रीज कर देंगे और gdb के साथ इंटरैक्ट नहीं कर पाएंगे। आपको या तो टेक्स्ट टर्मिनल पर स्विच करना होगा ( Ctrl+Alt+F2
) या ssh पर अपनी मशीन से कनेक्ट करना होगा।
उदाहरण:
अपने एक्स-सर्वर का पीआईडी खोजें:
$ ps ax | grep X
1237 tty1 Ssl+ 11:36 /usr/bin/X :0 vt1 -nr -nolisten tcp -auth /var/run/kdm/A:0-h6syCa
विंडो आईडी 0x1600045 है, इसलिए क्लाइंट बेस 0x1600000 है। एक्स-सर्वर से संलग्न करें और उस क्लाइंट बेस के लिए क्लाइंट सॉकेट डिस्क्रिप्टर ढूंढें। आपको एक्स-सर्वर (आरपीएम-वितरण के लिए -debuginfo पैकेज या डिब के लिए -dbg पैकेज) के लिए डिबग जानकारी स्थापित करने की आवश्यकता होगी।
$ sudo gdb
(gdb) define findclient
Type commands for definition of "findclient".
End with a line saying just "end".
> set $ii = 0
> while ($ii < currentMaxClients)
> if (clients[$ii] != 0 && clients[$ii]->clientAsMask == $arg0 && clients[$ii]->osPrivate != 0)
> print ((OsCommPtr)(clients[$ii]->osPrivate))->fd
> end
> set $ii = $ii + 1
> end
> end
(gdb) attach 1237
(gdb) findclient 0x1600000
$1 = 31
(gdb) detach
(gdb) quit
अब आप जानते हैं कि क्लाइंट एक सर्वर सॉकेट से जुड़ा हुआ है। 31. lsof
उस सॉकेट को खोजने के लिए उपयोग करें :
$ sudo lsof -n | grep 1237 | grep 31
X 1237 root 31u unix 0xffff810008339340 8512422 socket
(यहां "X" प्रक्रिया का नाम है, "1237" इसका pid है, "रूट" वह उपयोगकर्ता है जो इससे चल रहा है, "31u" एक सॉकेट विवरणक है)
वहां आप देख सकते हैं कि क्लाइंट टीसीपी से जुड़ा हुआ है, तो आप उस मशीन से जा सकते हैं जिससे यह जुड़ा हुआ है और netstat -nap
प्रक्रिया को खोजने के लिए वहां जांचें । लेकिन सबसे शायद आपको वहां एक यूनिक्स सॉकेट दिखाई देगा, जैसा कि ऊपर दिखाया गया है, जिसका मतलब है कि यह एक स्थानीय ग्राहक है।
उस यूनिक्स सॉकेट के लिए एक जोड़ी खोजने के लिए आप एमवीजी की तकनीक का उपयोग कर सकते हैं
(आपको अपने स्थापित किए गए नेटवर्क के लिए डिबग जानकारी की आवश्यकता होगी:
$ sudo gdb -c /proc/kcore
(gdb) print ((struct unix_sock*)0xffff810008339340)->peer
$1 = (struct sock *) 0xffff810008339600
(gdb) quit
अब जब आप क्लाइंट सॉकेट को जानते हैं, तो lsof
इसे पकड़े पीआईडी खोजने के लिए उपयोग करें:
$ sudo lsof -n | grep 0xffff810008339600
firefox 7725 username 146u unix 0xffff810008339600 8512421 socket
बस। उस विंडो को रखने की प्रक्रिया प्रोसेस-आईडी 7725 के साथ "फ़ायरफ़ॉक्स" है
2017 संपादित करें : अब और अधिक विकल्प हैं जैसा कि इस यूनिक्स सॉकेटपेयर के दूसरे छोर पर किसने देखा है ? । लिनक्स 3.3 या इसके बाद के संस्करण और lsof
4.89 या इसके बाद के संस्करण के साथ, आप 3 से 5 अंक बदल सकते हैं:
lsof +E -a -p 1237 -d 31
आईडी 1237 के साथ एक्स-सर्वर प्रक्रिया के fd 31 पर सॉकेट के दूसरे छोर पर कौन है यह जानने के लिए।