以编程方式测试任意用户是否可以访问任意文件

我希望能够编写说明用户soandso可以读取或编辑文件such_and_such测试或规范。 虽然我最终希望这是在RSpec中,但我认为它将全部归结为Bash命令(当然,整齐地包装在Ruby方法中),因为它似乎在Ruby的File类中不可用,或者我看过的其他任何事情。 我一直在寻找Bash中的东西来做这件事,并且找不到任何东西(File类中的任何东西看起来都没用)。 (注意:File.owned? 不能做我想要的,因为它只测试运行Ruby代码的进程是否为所有者,而不是任何任意用户有权编辑或读取,因此它在两个方面有显着差异。)

有没有办法做到这一点,内置到Bash? (或Ruby,或者一些我错过的Ruby gem?)或者我是否需要自己构建一个系统,获取文件的所有者和组信息,以及每个的读取,写入和执行位,然后查找该组的成员(如果so_and_so不是所有者),并通过所有权或组成员身份查看所需的权限是否可用于soandso

我目前只关心在类Unix系统上这样做,虽然不依赖于也可以在Windows上运行的Unix shell,这将是一个很好的奖励。

另外,我对测试实际文件感兴趣,所以像FakeFS这样的东西(据我所知)对我没用。 我不是要测试我的Ruby代码如何与文件系统交互,我试图validation是否可以对实际文件和目录执行所有必要的操作。 (同样,)我希望能够指定soandso可以编辑(或读取)文件such_and_such ,而不是指定文件such_and_suchsoandso拥有。 这一点的重点不是指定所有权(因为这是一个实现细节,可能需要更改以适应其他要求,例如安全性),但只指定我的应用程序和用户实际需要能够对文件系统执行的操作。

如果运行Ruby脚本的用户具有必要的权限,则可以尝试使用具有sudo的特定用户运行测试。

 sudo -u soandso test -r such_and_such 

-r测试可读性, -w可写性。 如果测试通过,返回码为0

顺便说一句,我认为,因为您正在寻找的function只能供超级用户使用(因为弄清楚其他人是否有足够的权限需要您至少拥有读取权限),这是有意义的,它是在Ruby File类中不容易获得。

我没有尝试过,但我想知道FileTest方法是否会起作用,因为他们说它们对“有效用户ID”进行操作。

 File.readable?(file_name) → true or false Link Returns true if the named file is readable by the effective user id of this process. File.writable?(file_name) → true or false Link Returns true if the named file is writable by the effective user id of this process. 

这与seteuid一起可能会成功。

 Process::Sys.seteuid(integer) → nil Link Set the effective user ID of the calling process to integer. Not available on all platforms. 

团体的东西也有setegid ……

使用File :: Stat和Etc模块解析权限

虽然这不是预先打包的解决方案,但您应该能够检查具有足够访问权限的给定文件,以获取模式,uid和gid信息。 然后,您可以解析/ etc / passwd/ etc / group ,以查明给定用户是否具有足够的权限。

一些构建块包括:

 # Get the file's octal mode. File.stat('/etc/passwd').mode.to_s(8) #=> "100644" # Get the group ID assigned to the file. File.stat('/etc/passwd').gid #=> 0 # Get the username associated with the given GID. Etc.getpwuid(0).name #=> "root" 

您还可以使用id实用程序获取有关给定用户的信息。 例如:

 %x{id root} #=> "uid=0(root) gid=0(root) groups=0(root)\n" 

但我认为使用标准库而不是解析id的输出会更容易。 因人而异。