我希望能够编写说明用户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 指定所有权(因为这是一个实现细节,可能需要更改以适应其他要求,例如安全性),但只指定我的应用程序和用户实际需要能够对文件系统进行操作。
答案 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)
虽然这不是预先打包的解决方案,但您应该能够检查具有 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。