2011-05-03 26 views
5

से जुड़ने से इंकार कर दिया गया है लिनक्स मशीन पर उपयोगकर्ता मोड [गैर रूट] में, मैं ioctl(iInterfaceSocket, SIOCSIFADDR, &stCommand) का उपयोग कर सॉकेट बांधने की कोशिश कर रहा हूं। मुझे error 13 -> Permission denied because of user mode मिल रहा है। अगर उपयोगकर्ता से कर्नेल मोड में परिवर्तन सब कुछ ठीक काम करता है।उपयोगकर्ता मोड अनुमति सॉकेट

मुझे केवल उपयोगकर्ता मोड में सॉकेट को बांधना होगा। ऊपर की समस्या को समझाने के दौरान कृपया समाधान का सुझाव दें। अगर मुझे कोई जानकारी याद आती है तो कृपया मुझे बताएं और मैं और जानकारी प्रदान करूंगा।

+3

'बाइंड()' के साथ क्या गलत है? – Erik

+1

@ user736403 - आप क्या हासिल करने की कोशिश कर रहे हैं? 'SIOCSIFADDR' सॉकेट बाध्य नहीं करता है, 'बाध्य()' करता है। 'SIOCSIFADDR' मशीन के नेटवर्क इंटरफ़ेस का पता सेट करता है। –

+1

बस एक छोटा नाइटपिक: रूट के रूप में प्रोग्राम चलाने से कर्नेल मोड में चलने से बहुत अलग है। रूट के रूप में चलने वाले प्रोग्राम अभी भी उपयोगकर्ता मोड में चलते हैं; वे सिर्फ ऊंचे विशेषाधिकार हैं। जब वे 'ioctl' जैसे सिस्टम कॉल करते हैं तो सभी प्रक्रियाओं (रूट या नहीं) उपयोगकर्ता और कर्नेल मोड के बीच स्विच करते हैं। –

उत्तर

7

आप इंटरफ़ेस पता सेट नहीं कर सकते हैं जब तक आप रूट न हों (ठीक है, तकनीकी रूप से, जब तक आपके पास CAP_NET_ADMIN न हो)। devinet.c देखें।

समाधान रूट के रूप में चलाने के लिए है। उस समाधान को कैसे कार्यान्वित करें, चाहे अपना पूरा प्रोग्राम SUID बनाना है, या उपयोगकर्ता को sudo या gksudo के माध्यम से चलाने के लिए कहें, या अपने प्रोग्राम को दो हिस्सों (रूट और गैर-रूट) में कारक बनाना है या नहीं, यह विकल्प आपके ऊपर है।