Есть ли лучший способ читать ACL в Ruby, чем анализ ls? - PullRequest
5 голосов
/ 22 марта 2011

В Mac OS X ls и chmod имеют некоторые дополнительные функции для обработки разрешений ACL , которые ОС размещает поверхразрешения по умолчанию для posix.У меня есть некоторые проблемы с правами доступа, которые требуют исправления , и я написал скрипт , чтобы помочь исправить эти проблемы, пока Apple не исправит эту ошибку.Вот код, который анализирует 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 разрешения из файла?

Мне нужны ACE и их индексы для использования с chmod позже в скрипте:

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

Ответы [ 6 ]

0 голосов
/ 26 января 2016

Я создал gem для чтения и изменения ACL:

>> 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
0 голосов
/ 28 марта 2012

Насколько я могу судить, лучшего варианта нет. Кажется, ACL не подвергаются воздействию OSA средствами Finder или System Events, поэтому приложение не поможет. Вы могли бы использовать функции FFI и POSIX ACL, но API на этом уровне чрезвычайно раздражает.

0 голосов
/ 30 марта 2011

как насчет 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

Вышеуказанное означает, что файл с именем "file" имеет разрешение 644.

0 голосов
/ 30 марта 2011

Это то, что вы ищете?

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 
0 голосов
/ 22 марта 2011

Это звучит как работа для IRB.(Введите irb в командной строке).Если вы этого еще не сделали, вам следует рассмотреть возможность использования IRB, если вы пишете Ruby, и / или rails console, если вы пишете приложение на Ruby on Rails.Когда вы запускаете последнее в корне приложения Rails, вы загружаете IRB со всем (или большей частью) кода, связанного с вашим приложением Rails.

Я сделал два файла, "file_1.txt" и "file_2.txt».Как пользователь "Чарли", я открываю оболочку IRB из каталога, в котором находятся эти файлы, и играю с классом Ruby's File на этих двух файлах:

-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 

Затем я сделал то же самое, что и root:

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 голосов
/ 22 марта 2011

Я просматриваю класс Ruby 1.8.7 File .Если мое минутное чтение будет правильным, я пойму, что разрешения процесса будут определять то, что вы можете увидеть из файла, и это именно то, что будет делать ls.

Итак, если RubyСценарий выполняется от имени пользователя root, он может получать все виды информации о файле, но если он работает от имени пользователя, и этот пользователь не входит в группу файла, а файл, например, не доступен для чтения всему миру, тогда сценарийне могу увидеть этот файл.

Похоже, если вы запускаете скрипт от имени определенного пользователя, и вы хотите изменить права доступа к файлу, вы можете собрать их и изменить их с помощью chmod в Ruby 1.8.7 по приведенной выше ссылке,нет

...