在 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 中检查指定用户的文件访问权限的主要内容,如果未能解决你的问题,请参考以下文章

windows无法访问指定设备路径或文件怎么解决

如何在 Swift 5 中检查指定目录中的文件?

在目录中创建文件之前检查目录中的写访问权限

我有一个冲突矩阵,以及具有不同访问权限的用户列表,我想检查该用户是不是为冲突访问权限

linux 用户怎么设置权限,只能访问指定的目录,其他目录都不允许访问

sudo简单应用