确定当前用户的文件权限

时间:2010-09-01 11:28:23

标签: c unix posix file-permissions

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

我正在编译指定目录的目录列表,并为每个文件报告一堆内容:文件名,大小,类型(文件/目录/其他),权限(您可以阅读,您可以编写)。对于尺寸和类型,我已经有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支持的加分点,虽然此时并非严格必要。

2 个答案:

答案 0 :(得分:8)

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使用时间检查时间条件的影响。您不应该使用access(2)授予或拒绝从特权进程向用户访问文件,您的程序将容易受到可能被利用的竞争条件的攻击。如果这是您要测试的内容,请在执行任何setfsuid(2)open(2)来电之前使用exec*()

答案 1 :(得分:3)

使用access()检查权限。