मैं कैसे बताऊं कि मैं एक चुरोट में चल रहा हूं?


46

मेरे पास एक यूनिक्स इंस्टॉलेशन है जिसे चेरोट और स्टैंडअलोन सिस्टम के रूप में उपयोग करने योग्य माना जाता है। अगर यह चेरोट के रूप में चल रहा है, तो मैं किसी भी सेवा (क्रोन, इनटीडी, और इतने पर) को चलाना नहीं चाहता, क्योंकि वे मेजबान प्रणाली के साथ संघर्ष करेंगे या बेमानी होंगे।

मैं एक शेल स्क्रिप्ट कैसे लिखूं जो एक अलग तरह से व्यवहार करता है कि क्या यह चिरोट में चल रहा है? मेरी तत्काल आवश्यकता एक आधुनिक लिनक्स सिस्टम है, /procचुरोट में घुड़सवार, और स्क्रिप्ट रूट के रूप में चल रही है, लेकिन अधिक पोर्टेबल उत्तर का भी स्वागत है। (देखें कि मैं कैसे बताऊं कि मैं चिरौट में चल रहा हूं अगर / proc माउंट नहीं है? लिनक्स के मामले के बिना /proc।)

अधिक सामान्यतः, सुझाव जो अन्य नियंत्रण विधियों के लिए काम करते हैं, दिलचस्प होगा। व्यावहारिक प्रश्न यह है कि क्या यह प्रणाली किसी भी सेवा को चलाने वाली है? (जवाब एक चेरोट में नहीं है, और एक पूरी तरह से आभासी मशीनों में हाँ, मुझे जेल या कंटेनर जैसे मध्यवर्ती मामलों के बारे में नहीं पता है।)

जवाबों:


45

मैंने यहां जो किया है वह परीक्षण करने के लिए है कि क्या initप्रक्रिया की जड़ (पीआईडी ​​1) वर्तमान प्रक्रिया की जड़ के समान है। हालाँकि /proc/1/root, हमेशा एक लिंक होता है /(जब तक कि initखुद को काट दिया नहीं जाता है, लेकिन यह एक ऐसा मामला नहीं है जिसकी मुझे परवाह है), इसके बाद यह "मास्टर" रूट डायरेक्टरी की ओर जाता है। इस तकनीक का उपयोग डेबियन में कुछ रखरखाव लिपियों में किया जाता है, उदाहरण के लिए चेरोट में स्थापना के बाद udev को छोड़ना।

if [ "$(stat -c %d:%i /)" != "$(stat -c %d:%i /proc/1/root/.)" ]; then
  echo "We are chrooted!"
else
  echo "Business as usual"
fi

(वैसे, यह अभी तक एक और उदाहरण है कि chrootसुरक्षा के लिए बेकार क्यों है अगर चिरोट की गई प्रक्रिया की जड़ तक पहुंच है। गैर-रूट प्रक्रियाएं नहीं पढ़ सकती हैं /proc/1/root, लेकिन /proc/1234/rootपीआईडी ​​1234 के साथ चलने वाली प्रक्रिया के समान होने पर वे अनुसरण कर सकते हैं। उपयोगकर्ता।)

यदि आपके पास रूट अनुमतियां नहीं हैं, तो आप ( /proc/1/mountinfoऔर लिनक्स कर्नेल प्रलेखन में/proc/$$/mountinfo संक्षिप्त रूप से filesystems/proc.txtप्रलेखित ) देख सकते हैं। यह फ़ाइल विश्व-पठनीय है और इसमें फाइल सिस्टम की प्रक्रिया के बारे में प्रत्येक आरोह बिंदु के बारे में बहुत सारी जानकारी है। उस फ़ाइल में पथ रीडर प्रक्रिया को प्रभावित करने वाले वर्ण द्वारा प्रतिबंधित हैं, यदि कोई हो। यदि पढ़ने की प्रक्रिया /proc/1/mountinfoएक फाइलसिस्टम में काट दी गई है जो वैश्विक रूट (पीआईडी ​​1 की जड़ वैश्विक रूट है) से अलग है, तो इसमें कोई प्रविष्टि /दिखाई नहीं देती है /proc/1/mountinfo। यदि पढ़ने की प्रक्रिया /proc/1/mountinfoको वैश्विक रूट फाइलसिस्टम पर निर्देशिका में ले जाया जाता है, तो इसके लिए एक प्रविष्टि /दिखाई देती है /proc/1/mountinfo, लेकिन एक अलग माउंट आईडी के साथ। संयोग से, जड़ क्षेत्र ($4) इंगित करता है कि चुरोट अपने मास्टर फाइल सिस्टम में कहां है।

[ "$(awk '$5=="/" {print $1}' </proc/1/mountinfo)" != "$(awk '$5=="/" {print $1}' </proc/$$/mountinfo)" ]

यह एक शुद्ध लिनक्स समाधान है। यह पर्याप्त रूप से समान /proc(सोलारिस के समान है /proc/1/root, मुझे लगता है, लेकिन नहीं mountinfo) के साथ अन्य यूनिक्स वेरिएंट के लिए सामान्य हो सकता है ।


1
यह OpenBSD में काम नहीं करेगा क्योंकि इसमें यादृच्छिक PID हैं ; मूल प्रक्रिया मूल रूप से PID 1 नहीं है। अब आप जानते हैं कि क्यों!
एडम काटज़

@AdamKatz "... स्पष्ट अपवादों के एक जोड़े के साथ, जैसे, init (8)।" तो यह कौन सा है?
मुरु १६'१५ को

@ मरमू: जाग, शक्स। तुमने मुझे गोली मार दी है। मुझे यकीन नहीं है कि init(8)# 1 स्लॉट होने की आवश्यकता क्यों होगी जब तक कि किसी प्रकार की हार्ड-कोडेड प्रकृति न हो जिसके लिए इसकी आवश्यकता होती है (जिसमें मैं अभी भी अनिश्चित क्यों हूं )। बेशक, बीएसडी के पास चुरोट की तुलना में बहुत अधिक उन्नत जेल हैं, इसलिए मुझे यह भी निश्चित नहीं है कि यह कितना समस्याग्रस्त है।
एडम काटज़

4
@AdamKatz यह विपरीत है: pid 1 की एक विशेष भूमिका है (इसे लाश को काटना चाहिए, और यह SIGRILLILL के लिए प्रतिरक्षा है)। Init प्रोग्राम उस भूमिका का कार्यान्वयन है। ओपनबीएसडी में काम नहीं करने के कारण मेरे जवाब का इससे कोई लेना-देना नहीं है: ऐसा इसलिए है क्योंकि ओपनबीएसडी में सोलारिस / लिनक्स जैसा कुछ भी नहीं है /proc। मेरा जवाब वैसे भी लिनक्स को संबोधित करने के लिए नहीं था।
गिलेस एसओ- बुराई को रोकना '

@ मुझे पता चला कि ओपनबीएसडी ने किसी न किसी तरीके से इसे हराया होगा। फिर भी, मुझे आश्चर्य है कि उन सभी विशेष भूमिका मदों को एक मनमाने ढंग से पीआईडी ​​(परिणाम के बिना) पर लागू करने में सक्षम नहीं है, जो कि मैंने अपने इटैलिकाइज़्ड "क्यों" का मतलब पहले किया था।
एडम काटज़

22

जैसा कि इनोड संख्या ज्ञात करने के लिए पोर्टेबल तरीके से उल्लेख किया गया है और भीतर से एक चिरोट जेल का पता लगा रहे हैं , आप जांच सकते हैं कि संख्या का इनोड संख्या :/2

$ ls -di /
2 /

एक इनोड संख्या जो 2 से भिन्न होती है, यह इंगित करती है कि स्पष्ट जड़ एक फाइलसिस्टम की वास्तविक जड़ नहीं है। यह उन chroots का पता नहीं लगाएगा, जो एक आरोह बिंदु पर, या यादृच्छिक रूट इनोड संख्या के साथ ऑपरेटिंग सिस्टम पर रूट किए जाते हैं


किस फाइलसिस्टम पर यह हेयुरिस्टिक काम करता है?
गिलेस एसओ-

Ext3 और hfs पर परीक्षण किया गया।
l0b0

इसलिए मैं चारों ओर बेवकूफ बना रहा था, और मुझे लगता है कि मुझे एक अधिक विश्वसनीय तरीका मिल गया है जिसमें रूट अनुमतियों (केवल लिनक्स) की आवश्यकता नहीं है। मैं अभी भी काउंटर-उदाहरणों या अधिक पोर्टेबल तरीकों के लिए खुला हूं।
गिल्स एसओ- बुराई को रोकना '

6
यह ext [234] के लिए सही है, लेकिन सभी फाइल सिस्टम के लिए नहीं। यह केवल यह भी परीक्षण करता है कि आपकी जड़ फाइलसिस्टम की जड़ है, जो कि वास्तविक जड़ के रूप में नहीं लगाया जा सकता है। दूसरे शब्दों में, यदि आप / जेल में एक और विभाजन को माउंट करते हैं chroot /jail, तो यह इस परीक्षण के लिए वास्तविक जड़ की तरह दिखेगा।
Psusi

1
@AdamKatz स्पष्ट रूप से नहीं। ओपनबेड 6.0-स्थिर में परीक्षण किया गया, इनोड संख्या वास्तविक रूट पथ के लिए अभी भी 2 है जबकि यह चेरोट के लिए एक यादृच्छिक संख्या है।
दिमित्री DB

5

हालांकि स्पष्ट रूप से उतने पोर्टेबल नहीं हैं जितने अन्य विकल्प यहां सूचीबद्ध हैं, यदि आप डेबियन-आधारित प्रणाली पर हैं, तो प्रयास करें ischroot

देखें: https://manpages.debian.org/jessie/debianutils/ischroot.1.en.html

कंसोल में सीधे स्थिति प्राप्त करने के लिए, इस्सरोट का उपयोग करके:

ischroot;echo $?

बाहर निकलें कोड:

0 if currently running in a chroot
1 if currently not running in a chroot
2 if the detection is not possible (On GNU/Linux this happens if the script is not run as root).
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.