在 C / *nix 中检查指定用户的文件访问权限
Posted
技术标签:
【中文标题】在 C / *nix 中检查指定用户的文件访问权限【英文标题】:Checking file access permissions for specified user in C / *nix 【发布时间】:2013-09-14 15:12:06 【问题描述】:这是我的问题。我需要从 FreeBSD 上的 C 代码检查特定文件和特定用户的读取权限。我写了一段代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char *argv[])
int r_ok;
if(setuid(1002))
printf("Cant's set uid\n");
exit(1);
r_ok = access("/tmp/dir", R_OK);
printf("error: %d: %s\n", errno, strerror(errno));
printf("%d\n", r_ok);
return 0;
一般来说它工作正常,但是当我像这样为 /tmp/dir 设置权限时:
d---r-x--- 2 root fruit1 512 Sep 10 18:20 /tmp/dir
程序输出
error: 13: Permission denied
-1
虽然 UID 为 1002 的用户是组 fruit1 的有效成员:
# groups 1002
orange fruit1
如有任何帮助,我将不胜感激。
【问题讨论】:
【参考方案1】:setuid()
设置进程的真实有效用户ID,但不 修改组访问列表,为此您必须调用setgid()
、initgroups()
或setgroups()
.
因此,您的程序使用使用的 ID 1002 以及原始组 ID 和组运行 访问列表,而不是与用户 1002 的组访问列表。 这就解释了为什么进程没有对该目录的读取权限。
请注意,access()
被视为“安全漏洞”(例如,请参见 access() Security Hole)。
通常最好尝试打开文件或目录而不是检查
事先读取权限。
【讨论】:
非常感谢。你的回答很有帮助。我想我可以使用faccessat
而不是access
用于相同的目的。以上是关于在 C / *nix 中检查指定用户的文件访问权限的主要内容,如果未能解决你的问题,请参考以下文章
我有一个冲突矩阵,以及具有不同访问权限的用户列表,我想检查该用户是不是为冲突访问权限