2013-02-19 10 views
18

os.getuid() के लिए दस्तावेज़ का कहना है:os.getuid() और os.geteuid() के बीच क्या अंतर है?

वापसी मौजूदा प्रक्रिया के उपयोगकर्ता आईडी।

और os.geteuid() का कहना है:

मौजूदा प्रक्रिया के लागू होने की प्रयोक्ता आईडी लौटें।

तो प्रयोक्ता आईडी और प्रभावी प्रयोक्ता आईडी के बीच क्या अंतर है?

मेरे लिए दोनों (2.x और 3.x दोनों पर) काम करता है। मैं इसका उपयोग यह जांचने के लिए कर रहा हूं कि स्क्रिप्ट रूट के रूप में चल रही है या नहीं।

+0

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

उत्तर

40

यह समझने के लिए कि कैसे os.getuid और os.geteuid भिन्न हैं, आपको यह समझने की आवश्यकता है कि वे पाइथन विशिष्ट फ़ंक्शन नहीं हैं (os मॉड्यूल उपसर्ग के अलावा)। वे फ़ंक्शन getuid और geteuid सिस्टम कॉल को लपेट रहे हैं जो अनिवार्य रूप से सभी यूनिक्स-जैसे ऑपरेटिंग सिस्टम द्वारा प्रदान किए जाते हैं।

तो, पाइथन डॉक्स (जो बहुत अधिक विवरण देने की संभावना नहीं है) को देखने के बजाय, आपको अपने ऑपरेटिंग सिस्टम के दस्तावेज़ों को देखना चाहिए। उदाहरण के लिए, Here लिनक्स के लिए प्रासंगिक दस्तावेज है। विकिपीडिया में भी एक अच्छा article on Unix User IDs है।

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

यहां एक उदाहरण है जो एक ईयूआईडी बदलता है: passwd प्रोग्राम (जिसका उपयोग आपके पासवर्ड को बदलने के लिए किया जाता है) को रूट उपयोगकर्ता द्वारा स्वामित्व वाली सिस्टम की पासवर्ड फ़ाइल में लिखना चाहिए। नियमित उपयोगकर्ता उस फ़ाइल को नहीं लिख सकते हैं, क्योंकि यदि वे कर सकते हैं, तो वे सभी के पासवर्ड भी बदल सकते हैं। इसे हल करने के लिए, passwd प्रोग्राम की फ़ाइल अनुमतियों में थोड़ा सा सेट है (जिसे setuid bit के नाम से जाना जाता है) जो ओएस को इंगित करता है कि इसे प्रोग्राम के मालिक (जैसे root) के ईयूआईडी के साथ चलाया जाना चाहिए, भले ही इसे किसी अन्य उपयोगकर्ता द्वारा लॉन्च किया जाए । passwd प्रोग्राम लॉन्च करने वाले उपयोगकर्ता के रूप में UID और उसके ईयूआईडी रूट के रूप में देखेगा। सिस्टम पासवर्ड फ़ाइल को लिखने के लिए यूरोपीय संघ को विशेषाधिकार प्राप्त करने की आवश्यकता है। यूआईडी भी उपयोगी है, क्योंकि passwd को यह जानने की जरूरत है कि यह किस उपयोगकर्ता के लिए पासवर्ड बदल रहा है।

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

6

फ़ंक्शन os.getuid() आपके प्रोग्राम को चलाने वाले उपयोगकर्ता की आईडी लौटाता है। फंक्शन os.geteuid() उपयोगकर्ता का प्रोग्राम आपके प्रोग्राम का उपयोग करता है। ज्यादातर मामलों में यह वही होगा। अच्छी तरह से ज्ञात मामला जब ये मान अलग होंगे तो setuid बिट आपके प्रोग्राम निष्पादन योग्य फ़ाइल के लिए सेट है, और जो उपयोगकर्ता आपके प्रोग्राम को चलाता है वह उपयोगकर्ता से अलग है जो प्रोग्राम निष्पादन योग्य है। इस मामले में os.getuid() प्रोग्राम चलाने वाले उपयोगकर्ता की आईडी लौटाएगा, जबकि os.geteuid() उस उपयोगकर्ता की आईडी लौटाएगा जो प्रोग्राम निष्पादन योग्य है।

+0

क्या आप 'os.geteuid()' भाग को विस्तृत कर सकते हैं? और क्या आप यह दिखाने के लिए उदाहरण दे सकते हैं कि दोनों समान नहीं हैं i.e. * x * केवल getuid के साथ प्राप्त किया जा सकता है और नहीं मिल सकता है, और * y * केवल geteuid के साथ ही प्राप्त किया जा सकता है और नहीं मिल सकता है? –

संबंधित मुद्दे