1

我希望能够编写说明用户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,而不是指定文件such_and_suchsoandso. 重点不是指定所有权(因为这是一个实现细节,可能需要更改以适应其他要求,例如安全性),而只是指定我的应用程序和用户实际上需要能够对文件系统执行的操作/在文件系统中执行的操作.

4

3 回答 3

1

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

sudo -u soandso test -r such_and_such

-r测试可读性,-w可写性。返回码是0测试是否通过。

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

于 2012-11-13T22:21:11.670 回答
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团体的东西......

于 2012-11-13T22:19:31.923 回答
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。

于 2012-11-13T23:03:27.593 回答