在Mac OS X上,ls
和chmod
具有一些额外的功能,用于处理操作系统在默认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}\"")
答案 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