2011-03-22 11 views
5

मैक ओएस एक्स, ls और chmod पर ACL अनुमतियों को संभालने के लिए कुछ अतिरिक्त सुविधाएं हैं जो डिफ़ॉल्ट पॉज़िक्स अनुमतियों के शीर्ष पर ओएस परतें हैं। I have some permission problems that need fixing, और I wrote a script इन समस्याओं को पैच करने में सहायता के लिए जब तक कि ऐप्पल उस बग को ठीक न करे। यहाँ कोड है कि ls पार्स ACL कदम उठाएं:क्या एलएस आउटपुट पार्सिंग की तुलना में रूबी में एसीएल पढ़ने का बेहतर तरीका है?

result = `#{Escape.shell_command(["ls", "-led", file])}` 
if result.empty? 
    # ls error... 
else 
    @acl = result.split("\n")[1..-1].collect do |ace| 
     ace = ace.split(": ", 2) 
     ace[0] = ace[0].to_i 
     ace 
    end 
    # acl processing code... 
end 

मैं escape मणि जोड़ा है, लेकिन यह अभी भी लगभग एक ही कोड है।

लेकिन मुझे पता है कि एक स्क्रिप्ट में ls को पार्स करने के लिए सामान्य रूप से यह एक बुरा विचार है, तो क्या फ़ाइल से ACL अनुमतियों को पढ़ने का बेहतर तरीका है?

मैं इक्के और उनकी सूचकांक लिपि में बाद में chmod साथ उपयोग करने की आवश्यकता:

system("chmod -a# #{index} \"#{file}\"") 
+0

'ls -led' ओएस एक्स उन्नत विशेषताओं हो जाता है? मुझे नहीं लगता कि रूबी इन विशेषताओं के लिए अंतर्निहित समर्थन रखेगी। @Swanand: मोड केवल सामान्य यूनिक्स अनुमति बिट्स से संबंधित है, है ना? – Nemo157

+0

@ निमो 157 हां, माफ करना, मैं भूल गया था, '-ई' विकल्प शायद ओएस एक्स के लिए अद्वितीय है। यह मानक' -l' आउटपुट – Tim

उत्तर

0

मैं रूबी 1.8.7 File वर्ग के माध्यम से देख रहा हूँ। अगर मेरा एक मिनट का पाठ सही है, तो मैं जो एकत्र करता हूं वह यह है कि प्रक्रिया की अनुमतियां फाइल से आप जो देख सकते हैं उसे नियंत्रित करेंगे, जो वास्तव में ls करेगा।

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

ऐसा लगता है कि आप एक निश्चित उपयोगकर्ता के रूप में एक स्क्रिप्ट चला रहे हैं, और आप फ़ाइल की अनुमतियां बदलना चाहते हैं, तो आप उन्हें ऊपर एकत्र कर सकते हैं और उन्हें उपरोक्त लिंक में रूबी 1.8.7 के chmod के साथ बदल सकते हैं, नहीं?

+0

मैक ओएस एक्स के chmod के बाद एसीएल प्रबंधन में एसीएल प्रबंधन के बाद एसीएल प्रिंट करता है। मुझे कहीं पढ़ना याद है कि यह एसीएल से निपटने का मानक यूनिक्स तरीका नहीं है (अगर मैं गलत हूं तो मुझे सही करें)। क्या रूबी का चम्मच इसके लिए खाता लेता है या क्या यह मानक यूनिक्स chmod व्यवहार करता है? – Tim

0

यह आईआरबी के लिए नौकरी की तरह लगता है। (कमांड लाइन पर irb टाइप करें)। यदि आप पहले से नहीं हैं, तो यदि आप रूबी पर रूबी लिख रहे हैं तो आपको रूबी, और/या rails console लिख रहे हैं, तो आपको आईआरबी का उपयोग करने पर विचार करना चाहिए। जब आप बाद वाले रेल अनुप्रयोग के रूट पर लॉन्च करते हैं, तो आप अपने रेल ऐप से जुड़े कोड के सभी (या अधिकतर) के साथ आईआरबी लोड करेंगे।

मैंने दो फाइलें, "file_1.txt" और "file_2.txt" बनाई हैं। उपयोगकर्ता "चार्ली" के रूप में, मैं निर्देशिका है जहाँ ये फ़ाइलें स्थित हैं से एक आईआरबी खोल खोल, और उन दो फाइलों पर रूबी के फ़ाइल वर्ग के साथ चारों ओर खेला: फिर

-rw-r--r-- 1 root  staff 30 Mar 22 09:06 file_1.txt 
-rwxrwxrwx 1 charlie staff 16 Mar 22 09:06 file_2.txt 

charlie:stackoverflow charlie$ man ls 
charlie:stackoverflow charlie$ irb 
ruby-1.8.7-p330 :001 > File.writable?("file_1.txt") 
=> false 

, मैं रूट के रूप में भी ऐसा ही किया:

irb(main):002:0> File.writable?("file_1.txt") 
=> true 
irb(main):003:0> File.writable?("file_2.txt") 
=> true 
irb(main):004:0> 

यह जानने के लिए कि मुझे क्या करना है, यह जानने के लिए मेरा तरीका है, और मुझे उम्मीद है कि आपके प्रश्न का उत्तर देने में मदद मिलेगी।

+0

हां मैंने irb का उपयोग किया है, यह बहुत आसान रहा है। लेकिन मुझे नहीं पता कि रूबी के भीतर से फाइल पर अंतर्निहित एसीएल प्रविष्टियों को पढ़ने का तरीका कैसे ढूंढें। – Tim

0

क्या यह आप के बाद क्या है?

File.chmod(0644, path)    # Sets the file to 0644 
printf("%o", File.stat(path).mode) # Returns the mode as an 
            # integer and is converted to octal 
100644 => nil 
+2

क्षमा करें, यह पॉज़िक्स अनुमतियां है। मुझे एसीएल अनुमतियों को संपादित करने की जरूरत है। अब तक ऐसा लगता है कि सिस्टम की 'chmod' उन्हें संभाल सकता है। मैं उम्मीद कर रहा था कि एसीएल को संभालने के लिए कुछ रूबी पुस्तकालय होंगे, इसलिए मैं 'एलएस' पार्सिंग से बच सकता था। – Tim

0

कैसे lstat के बारे में?

>> File.lstat('file') 
=> #<File::Stat dev=0x803, ino=3365, mode=0100644, nlink=1, uid=0, gid=0, rdev=0x0, size=1328, blksize=4096, blocks=8, atime=2011-03-30 08:39:30 +0800, mtime=2011-03-30 08:36:34 +0800, ctime=2011-03-30 08:36:34 +0800> 
>> print "%o" % (File.lstat('file').mode & 0777 ) 
644 

ऊपर "फाइल" कहा जाता है फ़ाइल का मतलब है जहां तक ​​मेरा बता सकते हैं 644.

+3

मुझे एसीएल अनुमतियों तक पहुंच की आवश्यकता है, न कि पॉजिक्स अनुमतियां। मैंने हाल ही में यह स्पष्ट करने के लिए प्रश्न को संशोधित किया है। – Tim

0

की अनुमति है, वहाँ वास्तव में एक बेहतर विकल्प नहीं है। एसीएल खोजक या सिस्टम घटनाओं द्वारा ओएसए के संपर्क में नहीं आते हैं, इसलिए ऐपस्क्रिप्ट मदद नहीं करेगा।आप एफएफआई और पॉज़िक्स एसीएल कार्यों का उपयोग कर सकते हैं, लेकिन उस स्तर पर एपीआई बहुत परेशान है।

0

मैं एक gem बनाया एसीएल पढ़ने और संशोधन कर रहे हैं:, सही

>> require 'acl' 
=> true 
>> acl = OSX::ACL.of("tmp") 
=> #<OSX::ACL:0x007f92eaabc578 @path="tmp"> 
>> acl.entries 
=> [#<OSX::ACL::Entry:0x007f92eaaf7510 @components=["user", "FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046", "_www", "70", "allow", "read"]>] 
>> ace = acl.entries.first 
=> #<OSX::ACL::Entry:0x007f92eaaf7510 @components=["user", "FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046", "_www", "70", "allow", "read"]> 
>> ace.assignment 
=> #<OSX::ACL::Assignment:0x007f92ea2a0060 @type="user", @uuid="FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046", @name="_www", @id="70"> 
>> ace.assignment.type 
=> "user" 
>> ace.assignment.name 
=> "_www" 
>> ace.rules 
=> ["allow"] 
>> ace.permissions 
=> ["read"] 
>> acl.remove_entry_at_index(0) 
chmod -a# 0 tmp # user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000046:_www:70:allow:read 
=> true 
संबंधित मुद्दे

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