1

Linux 功能access()允许我检查当前用户的文件权限。

是否有类似的功能可以为我提供相同的信息 - 但不是检查当前用户,而是检查任何给定系统用户的权限?

之类int access_for(const char *pathname, uid_t uid, int mode);的东西

我不能将seteuid()它用于会同时影响所有线程的多线程进程(POSIX 线程),因为我需要它。这就是为什么我需要自己检查文件权限的原因。

编辑:进程本身已知/假定至少具有相关用户的权限。所以,理论上我也可以遍历文件系统并手动计算权限,但我需要更有效的东西,因为检查需要每秒完成几次(最多数百次)。可能的?

4

3 回答 3

2

不知道它是如何工作的。如果您以用户 X 的身份运行,则无法可靠地检查用户 Y 是否有权访问某些内容,因为检查将在您的权限下完成。您可能无法访问可以执行的Y操作,这意味着您会得到误报。

于 2013-04-04T15:05:03.883 回答
2

当心TOCTOU。如果您现在检查文件可以访问,这并不意味着现在可以(或不能),因为您在“现在”和“现在”之间读取这些单词所花费的时间,文件权限可能好已经改变了。

因此,正确的解决方案是以您想要访问文件的用户身份在线程/进程中运行。否则,您将面临“工作时文件权限已更改”问题的风险。

当然,这适用于任何类型的访问“可能基于我的运行身份而受到限制的事物”。

于 2013-04-04T15:39:09.020 回答
1

在 Linux 上,基本上所有set*id操作都是线程本地的。这是错误且不符合标准的(标准指定进程而不是线程具有由这些函数设置的 id)并且用户空间代码(在 libc 中)必须通过微妙且容易出错的逻辑来解决该问题以同步的方式更改所有线程 uid。但是,您可以直接(通过syscall())调用系统调用来更改一个线程的 ID。

setfsuid此外,Linux 具有由函数设置的“文件系统 uid”的概念。如果我没记错的话,libc 会保留这个线程本地的,因为它没有由任何标准指定(因此没有任何要求)并且因为这个函数的全部目的是线程本地使用,就像你正在做。我认为如果它有效,第二个选项会更好。

最后,有一个完全可移植但速度慢的解决方案:fork然后seteuid在孩子中使用,在access那里调用,将结果传回给父母,然后_exit.

于 2013-04-04T15:24:01.543 回答