【问题标题】:Is there a better way to read ACLs in Ruby than parsing ls output?有没有比解析 ls 输出更好的方法来读取 Ruby 中的 ACL?
【发布时间】:2011-07-20 06:04:47
【问题描述】:

在 Mac OS X 上,lschmod 有一些额外的功能来处理操作系统在默认 posix 权限之上的ACL 权限。我have some permission problems that need fixingwrote 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}\"")

【问题讨论】:

  • ls -led 获取 OS X 高级属性,对吗?我认为 Ruby 不会内置对这些属性的支持。 @Swanand:该模式只处理普通的 unix 权限位不是吗?
  • @Nemo157 是的,抱歉我忘了,-e 选项可能是 OS X 独有的。它在标准 -l 输出之后打印出 ACL

标签: ruby macos permissions


【解决方案1】:

这就是你所追求的吗?

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 

【讨论】:

  • 抱歉,这是 posix 权限。我需要编辑 ACL 权限。到目前为止,看起来只有系统的chmod 可以处理它们。我希望有一些 Ruby 库来处理 ACL,这样我就可以避免解析 ls
【解决方案2】:

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。

【讨论】:

  • 我需要访问 ACL 权限,而不是 posix 权限。我最近修改了这个问题以使其更清楚。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我正在浏览 Ruby 1.8.7 File 类。如果我的一分钟阅读是正确的,我收集到的是进程的权限将控制您从文件中看到的内容,这正是 ls 将做的。

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

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

    【讨论】:

    • Mac OS X 的 chmod 绑定了 ACL 管理。我记得在某处读到这不是处理 ACL 的标准 Unix 方式(如果我错了,请纠正我)。 Ruby 的 chmod 是否考虑到了这一点,还是它只是执行标准的 Unix chmod 行为?
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      我制作了两个文件,“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> 
      

      这是我的工作方式,了解我需要做什么,我希望这有助于回答您的问题。

      【讨论】:

      • 是的,我用过 irb,非常好用。但我不知道如何找到一种方法来从 Ruby 中读取文件中的底层 ACL 条目。
      猜你喜欢
      • 2011-01-24
      • 2015-07-31
      • 2013-02-23
      • 2010-09-21
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多