2010-07-09 10 views
5

मैं एक ऐसा एप्लिकेशन लिख रहा हूं जिसके लिए रूट उपयोगकर्ता विशेषाधिकार निष्पादित करने की आवश्यकता है। अगर एक गैर जड़ उपयोगकर्ता द्वारा निष्पादित, यह बाहर निकल जाता है और इस तरह के रूप में एक perror संदेश के साथ समाप्त हो जाता है:मेरा सी/सी ++ एप्लिकेशन कैसे निर्धारित कर सकता है कि रूट उपयोगकर्ता कमांड निष्पादित कर रहा है या नहीं?

pthread_getschedparam: Operation not permitted 

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

आपकी मदद के लिए अग्रिम धन्यवाद।

+0

आमतौर पर हम इसके विपरीत चिंतित हैं: कितने प्रोग्राम रूट होने और विशेषाधिकार छोड़ने के बारे में चेतावनी देते हैं, उन्हें कोड को अधिक सुरक्षित रूप से चलाने की आवश्यकता नहीं है? – ShinTakezou

उत्तर

11

getuid या geteuid स्पष्ट विकल्प होंगे।

+5

अंतर को समझाना चाहते हैं ... –

+0

धन्यवाद। मैंने आसानी से तर्क बनाया है जो getuid() का उपयोग करता है, और अब यह वही करता है जो मैं चाहता था। –

11

मैं इस बदलाव को करने की सिफारिश करता हूं, लेकिन इसके बजाय आपके त्रुटि संदेश में सुधार करता हूं। यह संदिग्ध है कि आपके आवेदन को वास्तव में "रूट होना" की आवश्यकता है; इसके बजाय इसे रूट के कुछ विशेषाधिकारों की आवश्यकता होती है, लेकिन जुर्माना सुरक्षा नियंत्रण वाले कौन से ऑपरेटिंग सिस्टम इसे पूर्ण रूट पहुंच प्रदान किए बिना आवेदन प्रदान करने में सक्षम हो सकते हैं। यहां तक ​​कि यदि यह अब संभव नहीं है, तो अब से 6 महीने या 2 साल संभव हो सकते हैं, और यदि उपयोगकर्ता प्रोग्राम प्रदर्शन के बारे में पिछली धारणाओं के आधार पर चलाने के लिए इनकार कर रहा है, तो यह जांचने से इंकार कर रहा है कि यह निष्पादित करने में सफल होता है विशेषाधिकार प्राप्त संचालन की आवश्यकता है।

+0

AppArmor और SELinux जैसी चीजों के साथ, रिवर्स भी सत्य है, प्रक्रिया रूट के रूप में चल रही है और आप जो कुछ भी लेते हैं (जैसे कहीं भी लिखने में सक्षम होने) तक पहुंचने में सक्षम नहीं हैं, इसलिए मैं सहमत हूं, एक बेहतर सटीक त्रुटि संदेश बेहतर विकल्प है। – HalfBrian

+0

मैं सुनता हूं कि आप क्या कह रहे हैं, लेकिन यह त्रुटि संदेश मेरे हाथों से बाहर है। यह perror() और/या strerror() से आता है। इसके अलावा, यह तुरंत स्पष्ट नहीं है कि गलती का कारण क्या है। इस मामले में इरनो लौटाया गया था EPERM जो "ऑपरेशन की अनुमति नहीं है" में अनुवाद किया गया है pthread_setschedparam() के लिए मैन पेज पढ़ने पर (एसीके, मैंने अभी उपरोक्त मेरे त्रुटि आउटपुट में एक टाइपो महसूस किया है) , यह तुरंत नहीं था जो मुझे भूल गया था, लेकिन मुझे अंततः ईपीआरएम पर सम्मानित किया गया, जिसमें दो दोषपूर्ण कारण हैं जो "उपयोगकर्ता अनुमतियां" या "अमान्य पैरामीटर" –

+0

पर उबला हुआ है, हालांकि, मुझे लगता है कि मैं यह getuid जोड़ सकता हूं() जांचें कि क्या pthread_setschedparam() EPERM के साथ विफल रहता है, और यदि रूट नहीं है तो रूट के रूप में पुनः प्रयास करने के लिए कोई सुझाव दें? आखिरकार यह मेरी क्यूए टीम से मेरी रक्षा करेगा जो एप्लिकेशन को गैर-रूट के रूप में चलाएगा, यह ऊपर सूचीबद्ध संदेश के साथ असफल हो जाएगा और वे इसके टूटे हुए एक दोष को लॉग करेंगे। भले ही प्रलेखन कहता है कि इसे रूट विशेषाधिकारों के साथ चलाना चाहिए। मैं विफलता बिंदु पर जितना संभव हो उतना स्पष्ट कोशिश करना चाहता हूं और समस्या क्या है। –

5

क्या तुम सच में के लिए जाँच करना चाहते हैं तो आप सही क्षमता सेट है (CAP_SYS_NICE मुझे लगता है कि क्षमता की जरूरत है) को देखने के है आदमी पृष्ठों capabilities (7) और capget (2) इस तरह से इसे बाहर त्रुटि नहीं होगा यदि आप ऐसा करने की क्षमता है आप क्या चाहते हैं, लेकिन आप जड़ नहीं हैं।

+2

क्षमताएं बहुत लिनक्स-विशिष्ट हैं, इसलिए इस विधि का उपयोग करने से आपके प्रोग्राम की पोर्टेबिलिटी को नुकसान पहुंचाएगा।विशेषाधिकार प्राप्त संचालन करने की क्षमता के परीक्षण के लिए मेरा पसंदीदा तरीका केवल ऑपरेशन को आजमाएं और त्रुटियों की जांच करें। –

+0

@ spudd86: टिप के लिए धन्यवाद। मैं इस पर गौर करूंगा। @ आर ..: चेतावनी के लिए धन्यवाद। संयोग से पर्याप्त मैं एक लिनक्स आवेदन लिख रहा हूँ। मान्य पोर्टेबिलिटी अच्छा है। मैं इस चेक को सार कर सकता हूं ताकि अगर यह किसी अन्य प्लेटफ़ॉर्म पर पोर्ट किया गया हो तो वे अपने प्लेटफ़ॉर्म के लिए उपयुक्त चेक का विस्तार कर सकते हैं। –

+2

ठीक है अगर यह सिर्फ मित्रवत आउटपुट प्रिंट करने के लिए है, तो आप इसे सिर्फ #ifdef HAVE_CAPABILITIES या इस तरह के अंदर रख सकते हैं, और यदि यह अन्य सिस्टम पर चलाया जाता है तो कोड को छोड़ दें। –

7
#include <unistd.h> // getuid 
#include <stdio.h> // printf 

int main() 
{ 
    if (getuid()) printf("%s", "You must be root!\n"); 
    else printf("%s", "OK, you are root.\n"); 
    return 0; 
} 
+0

+1 'if (getuid()! = 0) के बजाय 'if (getuid())' लिखने के लिए +1। :-) यदि कार्यक्रम को सुड के साथ काम करना है, तो आप getuid() के बजाय geteuid() का उपयोग करना चाह सकते हैं। –

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

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