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

时间:2012-11-13 22:05:36

标签: ruby bash rspec

我希望能够编写说明用户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代码如何与文件系统交互,我试图验证是否可以对实际文件和目录执行所有必要的操作。 (同样,)我希望能够指定soandso可以编辑(或读取)文件such_and_such 指定文件{{ 1}}归such_and_such所有。这一点的全部内容是 not 指定所有权(因为这是一个实现细节,可能需要更改以适应其他要求,例如安全性),但只指定我的应用程序和用户实际需要能够对文件系统进行操作。

3 个答案:

答案 0 :(得分:1)

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

sudo -u soandso test -r such_and_such

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

顺便说一下,我认为既然您正在寻找的功能只能供超级用户使用(因为确定其他人是否有足够的权限需要您至少拥有读取权限),这是有道理的它在Ruby File类中不易获得。

答案 1 :(得分:0)

我还没有尝试过,但我想知道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 ......

答案 2 :(得分:0)

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

虽然这不是预先打包的解决方案,但您应该能够检查具有 stat 的足够访问权限的给定文件,以获取模式,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 的输出。 YMMV。