用程序测试任意用户是否有权访问任意文件



我希望能够编写测试或规范,声明用户soandso可以读取或编辑文件such_and_such。虽然我最终希望它出现在RSpec中,但我认为它要么全部归结为Bash命令(当然,巧妙地封装在Ruby方法中),因为它似乎在Ruby的File类中不可用,要么是我看过的任何其他东西。我一直在Bash中寻找可以做到这一点的东西,但找不到任何东西(File类中也没有任何东西看起来有用)。(注意:File.owned?不会做我想做的事情,因为它只测试运行Ruby代码的进程是否是所有者,而不是任何任意用户是否有编辑或读取的权限,所以在两方面有很大不同。)

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

我目前只关心在类Unix系统上做这件事,尽管一些不依赖于Unix shell的东西也可以在Windows上运行,这将是一个很好的奖励。

此外,我对测试实际的文件很感兴趣,所以像FakeFS这样的东西(据我所见)对我没有用处。我不是想测试我的Ruby代码如何与文件系统交互,我是想验证所有必要的操作都可以在实际的文件和目录上执行。(同样,)我希望能够指定soandso可以编辑(或读取)文件such_and_suchNOT指定文件such_and_suchsoandso所有。这件事的重点是不是指定所有权(因为这是一个实现细节,可能需要更改以适应其他要求,如安全性),而是只指定我的应用程序和用户实际上需要在文件系统中对/做些什么。

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

sudo -u soandso test -r such_and_such

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

顺便说一句,我认为由于您正在寻找的功能可能只对超级用户可用(因为要弄清楚其他人是否有足够的权限至少需要您拥有读取权限),所以它在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模块解析权限

虽然这不是一个预打包的解决方案,但您应该能够检查一个给定的文件,其中您有足够的权限访问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。

相关内容

  • 没有找到相关文章