是否有像access()这样的函数但是对于特定的用户ID?

时间:2013-04-04 15:03:17

标签: c linux freepascal

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

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

int access_for(const char *pathname, uid_t uid, int mode);或其他什么

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

谨防TOCTOU。如果你现在检查一个文件是否可以被访问,这并不意味着它现在可以(或不能),因为你在“NOW”和“NOW”之间读取这些单词的时间,文件权限可能好了改变。

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

当然,这适用于任何类型的访问“可能根据我的运行方式受到限制的事情”。

答案 2 :(得分:1)

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

此外,Linux具有setfsuid函数设置的“filesystem uid”概念。如果我没有弄错的话,libc将这一个线程留给本地,因为它没有被任何标准指定(因此没有对它施加任何要求)并且因为这个函数的整个目的是线程本地使用就像你'干嘛。如果有效,我认为第二种选择要好得多。

最后,有一个完全可移植但速度慢的解决方案:fork然后在子节点中使用seteuid,在那里调用access,将结果传递回父节点,{{1 }}