2011-07-08 15 views
6

द्वारा पाथ पहुंच योग्य है या नहीं, मेरे पास पाइथन (लिनक्स में) में एक इंस्टॉलेशन स्क्रिप्ट लिखा गया है जो रूट के रूप में चलता है और यह जांचने की आवश्यकता है कि कुछ फाइल गैर-रूट उपयोगकर्ता द्वारा पठनीय हैं या नहीं।जांचें कि गैर-रूट उपयोगकर्ता

इस कारण से मैं os.path.exists() या खुले (फ़ाइल नाम) का उपयोग नहीं कर सकता (और किसी भी अपवाद को पकड़ सकता हूं)।

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

क्या मेरा समाधान सबसे अच्छा है, या क्या बेहतर विकल्प हैं?

संपादित करें: फाइलों की जांच के बाद मुझे रूट के रूप में स्क्रिप्ट चलाने की आवश्यकता होगी, इसलिए रूट अनुमतियों को छोड़ना दुर्भाग्य से एक विकल्प नहीं है।

उत्तर

4

प्रभावी उपयोगकर्ता को कुछ गैर-रूट उपयोगकर्ता में बदलने के लिए आप os.seteuid का उपयोग कर सकते हैं। फिर फ़ाइल खोलने का प्रयास करें। अनुमति अस्वीकार होने पर IOError उठाया जाएगा।

import os 
os.seteuid(65534) # user 65534 is `nobody` 
filename='/etc/passwd-' 
try: 
    open(filename,'r') 
except IOError as err: 
    print(err) 

# [Errno 13] Permission denied: '/etc/passwd-' 
+1

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

+0

इस दृष्टिकोण के साथ एकमात्र समस्या यह है कि फ़ाइलों की जांच के बाद मुझे रूट के रूप में चलाने के लिए स्क्रिप्ट की आवश्यकता है। –

+0

@teehoo: प्रभावी उपयोगकर्ता को रूट करने के लिए रीसेट करने के लिए आप 'os.seteuid (0)' का उपयोग कर सकते हैं। – unutbu

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