【问题标题】:determine file permissions for the current user确定当前用户的文件权限
【发布时间】:2011-04-06 18:14:59
【问题描述】:

我正在寻找一种方法来确定当前用户(即进程的 UID)在 POSIX 兼容系统上的文件权限。我不想尝试打开文件 - 这可能会使目录和各种特殊文件变得混乱。

我正在编译一个指定目录的目录列表,并且对于每个文件,报告一堆东西:文件名、大小、类型(文件/目录/其他)、权限(可以读取,可以写入)。对于尺寸和类型,我已经有了stat 调用的结果。

这是我想出的:

if ((dirent->st_uid == getuid() && dirent->st_mode & S_IRUSR)
 || (dirent->st_gid == getgid() && dirent->st_mode & S_IRGRP)
 || (dirent->st_mode && S_IROTH)) entry->perm |= PERM_READ;
if ((dirent->st_uid == getuid() && dirent->st_mode & S_IWUSR)
 || (dirent->st_gid == getgid() && dirent->st_mode & S_IWGRP)
 || (dirent->st_mode && S_IWOTH)) entry->perm |= PERM_WRITE;

我必须这样做吗,还是有一个简单的调用/宏可以完成同样的事情? ACL 支持的奖励积分,尽管目前这不是绝对必要的。

【问题讨论】:

    标签: c unix posix file-permissions


    【解决方案1】:

    access(2) 将在内核中为您执行全套权限测试:

    #include <unistd.h>
    #include <stdio.h>
    
    int main(int argc, char* argv[]) {
        int i;
    
        for (i=0;i<argc;i++) {
                if(access(argv[i], R_OK)) {
                        printf("%s\n", argv[i]);
                        perror("R_OK");
                }
                if(access(argv[i], W_OK)) {
                        printf("%s\n", argv[i]);
                        perror("W_OK");
                }
        }
    
        return 0;
    }
    

    一些示例输出:

    $ ./foo ./foo /etc/passwd /etc/shadow
    /etc/passwd
    W_OK: Permission denied
    /etc/shadow
    R_OK: Permission denied
    /etc/shadow
    W_OK: Permission denied
    

    编辑

    请注意,access(2) 容易受到TOCTTOU Time-of-check-to-time-of-use 竞争条件的影响。您不应使用access(2) 授予或拒绝特权进程对用户文件的访问权限,您的程序将容易受到可能被利用的竞争条件的影响。如果这是您想要测试的内容,请在进行任何 open(2)exec*() 调用之前使用 setfsuid(2)

    【讨论】:

      【解决方案2】:

      使用@987654321@ 来检查权限。

      【讨论】:

        猜你喜欢
        • 2017-07-04
        • 2019-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多