是否有更好的方法来读取Ruby中的ACL而不是解析ls输出?

时间:2011-03-22 06:48:43

标签: ruby macos permissions

在Mac OS X上,lschmod具有一些额外的功能,用于处理操作系统在默认posix权限之上的ACL权限。我have some permission problems that need fixing和我wrote a script帮助解决这些问题,直到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 gem,但它实际上仍然是相同的代码。

但是我知道在脚本中解析ls一般是个坏主意,那么是否有更好的方法从文件中读取ACL权限?

我需要ACE及其索引在稍后的脚本中与chmod一起使用:

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

6 个答案:

答案 0 :(得分:0)

我正在浏览Ruby 1.8.7 File类。如果我的一分钟读数是正确的,那么我收集的是该过程的权限将决定您从文件中看到的内容,这正是ls将要执行的操作。

因此,如果Ruby脚本以root身份运行,它可以获取有关文件的各种信息,但是如果它以用户身份运行,并且该用户不在文件的组中,并且该文件不是世界例如,可读,然后脚本无法看到该文件。

看起来如果您正在以某个用户身份运行脚本,并且您想要更改文件的权限,您可以收集它们并使用上面链接中的Ruby 1.8.7 chmod更改它们,不?

答案 1 :(得分:0)

这听起来像是IRB的工作。 (在命令行输入irb)。如果你还没有,你应该考虑使用IRB,如果你正在编写Ruby,和/或rails console如果你正在编写Ruby on Rails应用程序。当您在Rails应用程序的根目录下启动后者时,您将使用与您的Rails应用程序关联的所有(或大部分)代码加载IRB。

我制作了两个文件“file_1.txt”和“file_2.txt”。作为用户“charlie”,我从这些文件所在的目录中打开一个IRB shell,并在这两个文件上使用Ruby的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> 

这是我的作案手法,要了解我需要做什么,我希望这有助于回答你的问题。

答案 2 :(得分: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 

答案 3 :(得分: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

以上意味着名为“file”的文件具有644的权限。

答案 4 :(得分:0)

据我所知,没有更好的选择。 Finder或系统事件似乎没有将ACL暴露给OSA,因此appscript无济于事。您可以使用FFI和POSIX ACL函数,但该级别的API非常烦人。

答案 5 :(得分:0)

我创建了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